← back to Dw Marketing Reels
New Arrivals reel: 7 curated heroes + local Kokoro VO + MusicGen BGM (/bin/zsh)
f2f43636bc7e784a9f1899a61d00161e2f92300b · 2026-07-17 08:01:36 -0700 · Steve Abrams
- Curated 7 hero picks (1-2 colorways/pattern) across Rebel Walls murals + Thibaut
- 1080x1920 9:16, 22.8s, yuv420p 30fps, AAC 44.1kHz
- Real local audio: Kokoro TTS voiceover (bf_isabella) over ducked MusicGen ambient bed
- Fixed banned-word: caption hashtags now #Wallcovering/#Wallcoverings (was #Wallpaper)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Files touched
M data/new-arrivals.jsonM data/reels.jsonA data/video-jobs.jsonM scripts/build-reel.mjsA videos/dw-new-arrivals-reveal/.hyperframes/caption-skin.htmlA videos/dw-new-arrivals-reveal/.media/preferences.jsonA videos/dw-new-arrivals-reveal/AGENTS.mdA videos/dw-new-arrivals-reveal/BRIEF.mdA videos/dw-new-arrivals-reveal/CLAUDE.mdA videos/dw-new-arrivals-reveal/SCRIPT.mdA videos/dw-new-arrivals-reveal/STORYBOARD.mdA videos/dw-new-arrivals-reveal/assets/fonts/cormorant-400.woff2A videos/dw-new-arrivals-reveal/assets/fonts/cormorant-500.woff2A videos/dw-new-arrivals-reveal/assets/fonts/cormorant-600.woff2A videos/dw-new-arrivals-reveal/assets/fonts/cormorant-italic-400.woff2A videos/dw-new-arrivals-reveal/assets/voice/01.wavA videos/dw-new-arrivals-reveal/assets/voice/02.wavA videos/dw-new-arrivals-reveal/assets/voice/03.wavA videos/dw-new-arrivals-reveal/assets/voice/04.wavA videos/dw-new-arrivals-reveal/assets/voice/05.wavA videos/dw-new-arrivals-reveal/assets/voice/06.wavA videos/dw-new-arrivals-reveal/assets/voice/07.wavA videos/dw-new-arrivals-reveal/assets/voice/08.wavA videos/dw-new-arrivals-reveal/audio_engine_meta.jsonA videos/dw-new-arrivals-reveal/audio_meta.jsonA videos/dw-new-arrivals-reveal/audio_request.jsonA videos/dw-new-arrivals-reveal/capture/assets/daintree-bluemoon-thibaut.jpgA videos/dw-new-arrivals-reveal/capture/assets/floral-chinoiserie-green.jpgA videos/dw-new-arrivals-reveal/capture/assets/floral-elegance-gray.jpgA videos/dw-new-arrivals-reveal/capture/assets/floral-fantasy-soft-pink.jpgA videos/dw-new-arrivals-reveal/capture/assets/gleniffer-black-and-grey.jpgA videos/dw-new-arrivals-reveal/capture/assets/maranta-arrowroot-pale-green.jpgA videos/dw-new-arrivals-reveal/capture/assets/serengeti-aqua-thibaut.jpgA videos/dw-new-arrivals-reveal/capture/assets/venus-black-thibaut.jpgA videos/dw-new-arrivals-reveal/capture/extracted/asset-descriptions.mdA videos/dw-new-arrivals-reveal/capture/extracted/tokens.jsonA videos/dw-new-arrivals-reveal/capture/extracted/visible-text.txtA videos/dw-new-arrivals-reveal/frame.mdA videos/dw-new-arrivals-reveal/hyperframes.jsonA videos/dw-new-arrivals-reveal/index.htmlA videos/dw-new-arrivals-reveal/meta.jsonA videos/dw-new-arrivals-reveal/package.json
Diff
commit f2f43636bc7e784a9f1899a61d00161e2f92300b
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Fri Jul 17 08:01:36 2026 -0700
New Arrivals reel: 7 curated heroes + local Kokoro VO + MusicGen BGM (/bin/zsh)
- Curated 7 hero picks (1-2 colorways/pattern) across Rebel Walls murals + Thibaut
- 1080x1920 9:16, 22.8s, yuv420p 30fps, AAC 44.1kHz
- Real local audio: Kokoro TTS voiceover (bf_isabella) over ducked MusicGen ambient bed
- Fixed banned-word: caption hashtags now #Wallcovering/#Wallcoverings (was #Wallpaper)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---
data/new-arrivals.json | 422 +++++++++----------
data/reels.json | 86 ++++
data/video-jobs.json | 1 +
scripts/build-reel.mjs | 2 +-
.../.hyperframes/caption-skin.html | 222 ++++++++++
.../dw-new-arrivals-reveal/.media/preferences.json | 48 +++
videos/dw-new-arrivals-reveal/AGENTS.md | 93 +++++
videos/dw-new-arrivals-reveal/BRIEF.md | 54 +++
videos/dw-new-arrivals-reveal/CLAUDE.md | 93 +++++
videos/dw-new-arrivals-reveal/SCRIPT.md | 64 +++
videos/dw-new-arrivals-reveal/STORYBOARD.md | 127 ++++++
.../assets/fonts/cormorant-400.woff2 | Bin 0 -> 22896 bytes
.../assets/fonts/cormorant-500.woff2 | Bin 0 -> 23260 bytes
.../assets/fonts/cormorant-600.woff2 | Bin 0 -> 23384 bytes
.../assets/fonts/cormorant-italic-400.woff2 | Bin 0 -> 23660 bytes
videos/dw-new-arrivals-reveal/assets/voice/01.wav | Bin 0 -> 88108 bytes
videos/dw-new-arrivals-reveal/assets/voice/02.wav | Bin 0 -> 345132 bytes
videos/dw-new-arrivals-reveal/assets/voice/03.wav | Bin 0 -> 186412 bytes
videos/dw-new-arrivals-reveal/assets/voice/04.wav | Bin 0 -> 329772 bytes
videos/dw-new-arrivals-reveal/assets/voice/05.wav | Bin 0 -> 293932 bytes
videos/dw-new-arrivals-reveal/assets/voice/06.wav | Bin 0 -> 312364 bytes
videos/dw-new-arrivals-reveal/assets/voice/07.wav | Bin 0 -> 263212 bytes
videos/dw-new-arrivals-reveal/assets/voice/08.wav | Bin 0 -> 167980 bytes
.../dw-new-arrivals-reveal/audio_engine_meta.json | 454 +++++++++++++++++++++
videos/dw-new-arrivals-reveal/audio_meta.json | 443 ++++++++++++++++++++
videos/dw-new-arrivals-reveal/audio_request.json | 44 ++
.../capture/assets/daintree-bluemoon-thibaut.jpg | Bin 0 -> 659919 bytes
.../capture/assets/floral-chinoiserie-green.jpg | Bin 0 -> 274803 bytes
.../capture/assets/floral-elegance-gray.jpg | Bin 0 -> 235683 bytes
.../capture/assets/floral-fantasy-soft-pink.jpg | Bin 0 -> 123281 bytes
.../capture/assets/gleniffer-black-and-grey.jpg | Bin 0 -> 694794 bytes
.../assets/maranta-arrowroot-pale-green.jpg | Bin 0 -> 525041 bytes
.../capture/assets/serengeti-aqua-thibaut.jpg | Bin 0 -> 350856 bytes
.../capture/assets/venus-black-thibaut.jpg | Bin 0 -> 506653 bytes
.../capture/extracted/asset-descriptions.md | 23 ++
.../capture/extracted/tokens.json | 6 +
.../capture/extracted/visible-text.txt | 23 ++
videos/dw-new-arrivals-reveal/frame.md | 286 +++++++++++++
videos/dw-new-arrivals-reveal/hyperframes.json | 12 +
videos/dw-new-arrivals-reveal/index.html | 59 +++
videos/dw-new-arrivals-reveal/meta.json | 5 +
videos/dw-new-arrivals-reveal/package.json | 11 +
42 files changed, 2366 insertions(+), 212 deletions(-)
diff --git a/data/new-arrivals.json b/data/new-arrivals.json
index 0b500fe..266b2ec 100644
--- a/data/new-arrivals.json
+++ b/data/new-arrivals.json
@@ -1,8 +1,218 @@
{
"source": "https://designerwallcoverings.com/collections/new-arrivals",
- "fetched_at": "2026-07-16T14:10:05.443Z",
+ "fetched_at": "2026-07-17T14:10:06.389Z",
"count": 24,
"items": [
+ {
+ "id": 7887308816435,
+ "handle": "floral-fantasy-soft-pink-wallcoverings-dwrw-361308",
+ "title": "Floral Fantasy, Soft Pink Wallcoverings | Rebel Walls",
+ "pattern": "Floral Fantasy",
+ "color": "Soft Pink",
+ "vendor": "Rebel Walls",
+ "product_type": "Mural",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R20466_interior1.webp?v=1784274020",
+ "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R20466_interior1_1200x.webp?v=1784274020",
+ "price": "191.00",
+ "url": "https://designerwallcoverings.com/products/floral-fantasy-soft-pink-wallcoverings-dwrw-361308",
+ "created_at": "2026-07-17T00:40:17-07:00",
+ "published_at": "2026-07-17T00:40:18-07:00"
+ },
+ {
+ "id": 7887308783667,
+ "handle": "floral-fantasy-pink-wallcoverings-dwrw-361307",
+ "title": "Floral Fantasy, Pink Wallcoverings | Rebel Walls",
+ "pattern": "Floral Fantasy",
+ "color": "Pink",
+ "vendor": "Rebel Walls",
+ "product_type": "Mural",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R20463_interior1.jpg?v=1784274018",
+ "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R20463_interior1_1200x.jpg?v=1784274018",
+ "price": "191.00",
+ "url": "https://designerwallcoverings.com/products/floral-fantasy-pink-wallcoverings-dwrw-361307",
+ "created_at": "2026-07-17T00:40:14-07:00",
+ "published_at": "2026-07-17T00:40:16-07:00"
+ },
+ {
+ "id": 7887308750899,
+ "handle": "floral-fantasy-gray-wallcoverings-dwrw-361306",
+ "title": "Floral Fantasy, Gray Wallcoverings | Rebel Walls",
+ "pattern": "Floral Fantasy",
+ "color": "Gray",
+ "vendor": "Rebel Walls",
+ "product_type": "Mural",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R20465_interior1.jpg?v=1784274015",
+ "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R20465_interior1_1200x.jpg?v=1784274015",
+ "price": "191.00",
+ "url": "https://designerwallcoverings.com/products/floral-fantasy-gray-wallcoverings-dwrw-361306",
+ "created_at": "2026-07-17T00:40:12-07:00",
+ "published_at": "2026-07-17T00:40:13-07:00"
+ },
+ {
+ "id": 7887308718131,
+ "handle": "floral-fantasy-black-wallcoverings-dwrw-361305",
+ "title": "Floral Fantasy, Black Wallcoverings | Rebel Walls",
+ "pattern": "Floral Fantasy",
+ "color": "Black",
+ "vendor": "Rebel Walls",
+ "product_type": "Mural",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R20464_interior1.jpg?v=1784274013",
+ "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R20464_interior1_1200x.jpg?v=1784274013",
+ "price": "191.00",
+ "url": "https://designerwallcoverings.com/products/floral-fantasy-black-wallcoverings-dwrw-361305",
+ "created_at": "2026-07-17T00:40:10-07:00",
+ "published_at": "2026-07-17T00:40:10-07:00"
+ },
+ {
+ "id": 7887308685363,
+ "handle": "floral-elegance-gray-wallcoverings-dwrw-361304",
+ "title": "Floral Elegance, Gray Wallcoverings | Rebel Walls",
+ "pattern": "Floral Elegance",
+ "color": "Gray",
+ "vendor": "Rebel Walls",
+ "product_type": "Mural",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R22424_interior1.webp?v=1784274011",
+ "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R22424_interior1_1200x.webp?v=1784274011",
+ "price": "191.00",
+ "url": "https://designerwallcoverings.com/products/floral-elegance-gray-wallcoverings-dwrw-361304",
+ "created_at": "2026-07-17T00:40:06-07:00",
+ "published_at": "2026-07-17T00:40:08-07:00"
+ },
+ {
+ "id": 7887119679539,
+ "handle": "venus-black-dwtt-74291",
+ "title": "Venus, Black Wallcoverings | Thibaut",
+ "pattern": "Venus",
+ "color": "Black",
+ "vendor": "Thibaut",
+ "product_type": "Wallcovering",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85069_37abaf04-2400-49f6-a937-764fb0aae01c.jpg?v=1784238020",
+ "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85069_37abaf04-2400-49f6-a937-764fb0aae01c_1200x.jpg?v=1784238020",
+ "price": "74.93",
+ "url": "https://designerwallcoverings.com/products/venus-black-dwtt-74291",
+ "created_at": "2026-07-16T14:40:16-07:00",
+ "published_at": "2026-07-16T14:40:18-07:00"
+ },
+ {
+ "id": 7887119646771,
+ "handle": "diamond-head-light-blue-dwtt-74290",
+ "title": "Diamond Head, Light Blue Wallcoverings | Thibaut",
+ "pattern": "Diamond Head",
+ "color": "Light Blue",
+ "vendor": "Thibaut",
+ "product_type": "Wallcovering",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85057_bad40471-ef23-46bf-8871-3083dfe07041.jpg?v=1784238015",
+ "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85057_bad40471-ef23-46bf-8871-3083dfe07041_1200x.jpg?v=1784238015",
+ "price": "76.56",
+ "url": "https://designerwallcoverings.com/products/diamond-head-light-blue-dwtt-74290",
+ "created_at": "2026-07-16T14:40:12-07:00",
+ "published_at": "2026-07-16T14:40:14-07:00"
+ },
+ {
+ "id": 7887119614003,
+ "handle": "diamond-head-navy-dwtt-74289",
+ "title": "Diamond Head, Navy Wallcoverings | Thibaut",
+ "pattern": "Diamond Head",
+ "color": "Navy",
+ "vendor": "Thibaut",
+ "product_type": "Wallcovering",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85056_91eb5596-5e18-4fa9-9abd-be44220d37e7.jpg?v=1784238011",
+ "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85056_91eb5596-5e18-4fa9-9abd-be44220d37e7_1200x.jpg?v=1784238011",
+ "price": "76.56",
+ "url": "https://designerwallcoverings.com/products/diamond-head-navy-dwtt-74289",
+ "created_at": "2026-07-16T14:40:07-07:00",
+ "published_at": "2026-07-16T14:40:10-07:00"
+ },
+ {
+ "id": 7886637629491,
+ "handle": "daintree-blue-on-white-dwtt-74288",
+ "title": "Daintree, Blue on White Wallcoverings | Thibaut",
+ "pattern": "Daintree",
+ "color": "Blue on White",
+ "vendor": "Thibaut",
+ "product_type": "Wallcovering",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85044_ab28d492-8f66-4bfb-97c8-6653b3551a11.jpg?v=1784216419",
+ "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85044_ab28d492-8f66-4bfb-97c8-6653b3551a11_1200x.jpg?v=1784216419",
+ "price": "99.37",
+ "url": "https://designerwallcoverings.com/products/daintree-blue-on-white-dwtt-74288",
+ "created_at": "2026-07-16T08:40:16-07:00",
+ "published_at": "2026-07-16T08:40:17-07:00"
+ },
+ {
+ "id": 7886637334579,
+ "handle": "daintree-pearl-dwtt-74287",
+ "title": "Daintree, Pearl Wallcoverings | Thibaut",
+ "pattern": "Daintree",
+ "color": "Pearl",
+ "vendor": "Thibaut",
+ "product_type": "Wallcovering",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85045_acf3eb80-9a01-46a4-afc0-efbf4fc48afa.jpg?v=1784216415",
+ "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85045_acf3eb80-9a01-46a4-afc0-efbf4fc48afa_1200x.jpg?v=1784216415",
+ "price": "99.37",
+ "url": "https://designerwallcoverings.com/products/daintree-pearl-dwtt-74287",
+ "created_at": "2026-07-16T08:40:12-07:00",
+ "published_at": "2026-07-16T08:40:14-07:00"
+ },
+ {
+ "id": 7886636908595,
+ "handle": "diamond-head-chartreuse-dwtt-74286",
+ "title": "Diamond Head, Chartreuse Wallcoverings | Thibaut",
+ "pattern": "Diamond Head",
+ "color": "Chartreuse",
+ "vendor": "Thibaut",
+ "product_type": "Wallcovering",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85053_42caeb76-18f5-48ac-9524-0306b79a01af.jpg?v=1784216411",
+ "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85053_42caeb76-18f5-48ac-9524-0306b79a01af_1200x.jpg?v=1784216411",
+ "price": "76.56",
+ "url": "https://designerwallcoverings.com/products/diamond-head-chartreuse-dwtt-74286",
+ "created_at": "2026-07-16T08:40:08-07:00",
+ "published_at": "2026-07-16T08:40:10-07:00"
+ },
+ {
+ "id": 7886509178931,
+ "handle": "daintree-aqua-dwtt-74285",
+ "title": "Daintree, Aqua Wallcoverings | Thibaut",
+ "pattern": "Daintree",
+ "color": "Aqua",
+ "vendor": "Thibaut",
+ "product_type": "Wallcovering",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85043.jpg?v=1784212818",
+ "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85043_1200x.jpg?v=1784212818",
+ "price": "99.37",
+ "url": "https://designerwallcoverings.com/products/daintree-aqua-dwtt-74285",
+ "created_at": "2026-07-16T07:40:15-07:00",
+ "published_at": "2026-07-16T07:40:17-07:00"
+ },
+ {
+ "id": 7886509146163,
+ "handle": "daintree-fuchsia-dwtt-74284",
+ "title": "Daintree, Fuchsia Wallcoverings | Thibaut",
+ "pattern": "Daintree",
+ "color": "Fuchsia",
+ "vendor": "Thibaut",
+ "product_type": "Wallcovering",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85042_9e1fd8a7-1e53-4146-8341-438a63c2498a.jpg?v=1784212815",
+ "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85042_9e1fd8a7-1e53-4146-8341-438a63c2498a_1200x.jpg?v=1784212815",
+ "price": "99.37",
+ "url": "https://designerwallcoverings.com/products/daintree-fuchsia-dwtt-74284",
+ "created_at": "2026-07-16T07:40:12-07:00",
+ "published_at": "2026-07-16T07:40:13-07:00"
+ },
+ {
+ "id": 7886509047859,
+ "handle": "daintree-grey-dwtt-74283",
+ "title": "Daintree, Grey Wallcoverings | Thibaut",
+ "pattern": "Daintree",
+ "color": "Grey",
+ "vendor": "Thibaut",
+ "product_type": "Wallcovering",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85041.jpg?v=1784212810",
+ "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85041_1200x.jpg?v=1784212810",
+ "price": "99.37",
+ "url": "https://designerwallcoverings.com/products/daintree-grey-dwtt-74283",
+ "created_at": "2026-07-16T07:40:07-07:00",
+ "published_at": "2026-07-16T07:40:10-07:00"
+ },
{
"id": 7886165442611,
"handle": "floral-drape-wallcoverings-dwrw-361303",
@@ -152,216 +362,6 @@
"url": "https://designerwallcoverings.com/products/maranta-arrowroot-pale-green-dwtt-74278",
"created_at": "2026-07-15T17:40:11-07:00",
"published_at": "2026-07-15T17:40:12-07:00"
- },
- {
- "id": 7886031683635,
- "handle": "maranta-arrowroot-burgundy-dwtt-74277",
- "title": "Maranta Arrowroot, Burgundy Wallcoverings | Thibaut",
- "pattern": "Maranta Arrowroot",
- "color": "Burgundy",
- "vendor": "Thibaut",
- "product_type": "Wallcovering",
- "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85011.jpg?v=1784162409",
- "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85011_1200x.jpg?v=1784162409",
- "price": "306.24",
- "url": "https://designerwallcoverings.com/products/maranta-arrowroot-burgundy-dwtt-74277",
- "created_at": "2026-07-15T17:40:06-07:00",
- "published_at": "2026-07-15T17:40:09-07:00"
- },
- {
- "id": 7885998358579,
- "handle": "maranta-arrowroot-black-dwtt-74276",
- "title": "Maranta Arrowroot, Black Wallcoverings | Thibaut",
- "pattern": "Maranta Arrowroot",
- "color": "Black",
- "vendor": "Thibaut",
- "product_type": "Wallcovering",
- "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85009_339cb61e-0525-4f57-9fa8-5d49d87f769a.jpg?v=1784158818",
- "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85009_339cb61e-0525-4f57-9fa8-5d49d87f769a_1200x.jpg?v=1784158818",
- "price": "306.24",
- "url": "https://designerwallcoverings.com/products/maranta-arrowroot-black-dwtt-74276",
- "created_at": "2026-07-15T16:40:15-07:00",
- "published_at": "2026-07-15T16:40:16-07:00"
- },
- {
- "id": 7885998293043,
- "handle": "maranta-arrowroot-navy-dwtt-74275",
- "title": "Maranta Arrowroot, Navy Wallcoverings | Thibaut",
- "pattern": "Maranta Arrowroot",
- "color": "Navy",
- "vendor": "Thibaut",
- "product_type": "Wallcovering",
- "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85010.jpg?v=1784158814",
- "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85010_1200x.jpg?v=1784158814",
- "price": "306.24",
- "url": "https://designerwallcoverings.com/products/maranta-arrowroot-navy-dwtt-74275",
- "created_at": "2026-07-15T16:40:11-07:00",
- "published_at": "2026-07-15T16:40:13-07:00"
- },
- {
- "id": 7885998194739,
- "handle": "maranta-arrowroot-cream-dwtt-74274",
- "title": "Maranta Arrowroot, Cream Wallcoverings | Thibaut",
- "pattern": "Maranta Arrowroot",
- "color": "Cream",
- "vendor": "Thibaut",
- "product_type": "Wallcovering",
- "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85008_ce7c7dec-949d-4618-ae84-a4afa4c85eea.jpg?v=1784158810",
- "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85008_ce7c7dec-949d-4618-ae84-a4afa4c85eea_1200x.jpg?v=1784158810",
- "price": "306.24",
- "url": "https://designerwallcoverings.com/products/maranta-arrowroot-cream-dwtt-74274",
- "created_at": "2026-07-15T16:40:07-07:00",
- "published_at": "2026-07-15T16:40:09-07:00"
- },
- {
- "id": 7885984530483,
- "handle": "maranta-arrowroot-beige-dwtt-74273",
- "title": "Maranta Arrowroot, Beige Wallcoverings | Thibaut",
- "pattern": "Maranta Arrowroot",
- "color": "Beige",
- "vendor": "Thibaut",
- "product_type": "Wallcovering",
- "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85006_dcbff750-e45a-4e3a-bb7e-8741b3019dc0.jpg?v=1784155219",
- "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85006_dcbff750-e45a-4e3a-bb7e-8741b3019dc0_1200x.jpg?v=1784155219",
- "price": "306.24",
- "url": "https://designerwallcoverings.com/products/maranta-arrowroot-beige-dwtt-74273",
- "created_at": "2026-07-15T15:40:16-07:00",
- "published_at": "2026-07-15T15:40:17-07:00"
- },
- {
- "id": 7885984497715,
- "handle": "maranta-arrowroot-teal-dwtt-74272",
- "title": "Maranta Arrowroot, Teal Wallcoverings | Thibaut",
- "pattern": "Maranta Arrowroot",
- "color": "Teal",
- "vendor": "Thibaut",
- "product_type": "Wallcovering",
- "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85004_db41712b-e583-40fd-8c6f-89cda3e1c809.jpg?v=1784155215",
- "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85004_db41712b-e583-40fd-8c6f-89cda3e1c809_1200x.jpg?v=1784155215",
- "price": "306.24",
- "url": "https://designerwallcoverings.com/products/maranta-arrowroot-teal-dwtt-74272",
- "created_at": "2026-07-15T15:40:12-07:00",
- "published_at": "2026-07-15T15:40:14-07:00"
- },
- {
- "id": 7885984464947,
- "handle": "maranta-arrowroot-aqua-dwtt-74271",
- "title": "Maranta Arrowroot, Aqua Wallcoverings | Thibaut",
- "pattern": "Maranta Arrowroot",
- "color": "Aqua",
- "vendor": "Thibaut",
- "product_type": "Wallcovering",
- "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85003_c0267c31-1ee8-48ae-b3f9-f1eaed9951ac.jpg?v=1784155211",
- "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T85003_c0267c31-1ee8-48ae-b3f9-f1eaed9951ac_1200x.jpg?v=1784155211",
- "price": "306.24",
- "url": "https://designerwallcoverings.com/products/maranta-arrowroot-aqua-dwtt-74271",
- "created_at": "2026-07-15T15:40:07-07:00",
- "published_at": "2026-07-15T15:40:10-07:00"
- },
- {
- "id": 7885948649523,
- "handle": "treviso-marble-smoke-dwtt-74270",
- "title": "Treviso Marble, Smoke Wallcoverings | Thibaut",
- "pattern": "Treviso Marble",
- "color": "Smoke",
- "vendor": "Thibaut",
- "product_type": "Wallcovering",
- "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T75177_c821b9a4-9999-4924-a6bc-8e0faf87e031.jpg?v=1784151618",
- "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T75177_c821b9a4-9999-4924-a6bc-8e0faf87e031_1200x.jpg?v=1784151618",
- "price": "84.71",
- "url": "https://designerwallcoverings.com/products/treviso-marble-smoke-dwtt-74270",
- "created_at": "2026-07-15T14:40:16-07:00",
- "published_at": "2026-07-15T14:40:17-07:00"
- },
- {
- "id": 7885948616755,
- "handle": "treviso-marble-neutral-dwtt-74269",
- "title": "Treviso Marble, Neutral Wallcoverings | Thibaut",
- "pattern": "Treviso Marble",
- "color": "Neutral",
- "vendor": "Thibaut",
- "product_type": "Wallcovering",
- "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T75171_42149573-6052-4b52-b319-8a180331b852.jpg?v=1784151615",
- "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T75171_42149573-6052-4b52-b319-8a180331b852_1200x.jpg?v=1784151615",
- "price": "84.71",
- "url": "https://designerwallcoverings.com/products/treviso-marble-neutral-dwtt-74269",
- "created_at": "2026-07-15T14:40:13-07:00",
- "published_at": "2026-07-15T14:40:14-07:00"
- },
- {
- "id": 7885948485683,
- "handle": "boa-black-on-metallic-gold-dwtt-74268",
- "title": "Boa, Black on Metallic Gold Wallcoverings | Thibaut",
- "pattern": "Boa",
- "color": "Black on Metallic Gold",
- "vendor": "Thibaut",
- "product_type": "Wallcovering",
- "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T75168_8d3fe98d-44da-4a8c-b0ce-ace844ac5864.jpg?v=1784151611",
- "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T75168_8d3fe98d-44da-4a8c-b0ce-ace844ac5864_1200x.jpg?v=1784151611",
- "price": "81.45",
- "url": "https://designerwallcoverings.com/products/boa-black-on-metallic-gold-dwtt-74268",
- "created_at": "2026-07-15T14:40:07-07:00",
- "published_at": "2026-07-15T14:40:10-07:00"
- },
- {
- "id": 7885926629427,
- "handle": "boa-aqua-on-metallic-gold-dwtt-74267",
- "title": "Boa, Aqua on Metallic Gold Wallcoverings | Thibaut",
- "pattern": "Boa",
- "color": "Aqua on Metallic Gold",
- "vendor": "Thibaut",
- "product_type": "Wallcovering",
- "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T75167.jpg?v=1784148019",
- "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T75167_1200x.jpg?v=1784148019",
- "price": "81.45",
- "url": "https://designerwallcoverings.com/products/boa-aqua-on-metallic-gold-dwtt-74267",
- "created_at": "2026-07-15T13:40:16-07:00",
- "published_at": "2026-07-15T13:40:17-07:00"
- },
- {
- "id": 7885926531123,
- "handle": "portland-metallic-pewter-dwtt-74266",
- "title": "Portland, Metallic Pewter Wallcoverings | Thibaut",
- "pattern": "Portland",
- "color": "Metallic Pewter",
- "vendor": "Thibaut",
- "product_type": "Wallcovering",
- "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T75143.jpg?v=1784148016",
- "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T75143_1200x.jpg?v=1784148016",
- "price": "130.32",
- "url": "https://designerwallcoverings.com/products/portland-metallic-pewter-dwtt-74266",
- "created_at": "2026-07-15T13:40:12-07:00",
- "published_at": "2026-07-15T13:40:14-07:00"
- },
- {
- "id": 7885926498355,
- "handle": "portland-white-dwtt-74265",
- "title": "Portland, White Wallcoverings | Thibaut",
- "pattern": "Portland",
- "color": "White",
- "vendor": "Thibaut",
- "product_type": "Wallcovering",
- "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T75138.jpg?v=1784148010",
- "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T75138_1200x.jpg?v=1784148010",
- "price": "130.32",
- "url": "https://designerwallcoverings.com/products/portland-white-dwtt-74265",
- "created_at": "2026-07-15T13:40:08-07:00",
- "published_at": "2026-07-15T13:40:10-07:00"
- },
- {
- "id": 7885884850227,
- "handle": "haywood-charcoal-dwtt-74264",
- "title": "Haywood, Charcoal Wallcoverings | Thibaut",
- "pattern": "Haywood",
- "color": "Charcoal",
- "vendor": "Thibaut",
- "product_type": "Wallcovering",
- "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T75136_2c6b84f7-382c-400e-aa52-1bcb2e6d1f63.jpg?v=1784144418",
- "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T75136_2c6b84f7-382c-400e-aa52-1bcb2e6d1f63_1200x.jpg?v=1784144418",
- "price": "149.86",
- "url": "https://designerwallcoverings.com/products/haywood-charcoal-dwtt-74264",
- "created_at": "2026-07-15T12:40:15-07:00",
- "published_at": "2026-07-15T12:40:17-07:00"
}
]
}
\ No newline at end of file
diff --git a/data/reels.json b/data/reels.json
index 160875f..bfc2068 100644
--- a/data/reels.json
+++ b/data/reels.json
@@ -1,4 +1,90 @@
[
+ {
+ "file": "new-arrivals-audio-2026-07-17-14-57.mp4",
+ "file_silent": "new-arrivals-2026-07-17-14-51.mp4",
+ "created_at": "2026-07-17T14:51:42.855Z",
+ "products": 7,
+ "seconds": 22.8,
+ "audio": {
+ "voiceover": "Kokoro TTS (bf_isabella), local, $0",
+ "bgm": "MusicGen small (facebook/musicgen-small), local, $0",
+ "mix": "MusicGen bed ducked to 0.22 + fade; Kokoro VO delayed 1.6s at 1.35x; alimiter"
+ },
+ "curated": true,
+ "curation_note": "7 heroes hand-picked for variety: 1-2 colorways per pattern across Rebel Walls murals + Thibaut wallcoverings",
+ "titles": [
+ "Floral Fantasy / Soft Pink",
+ "Venus / Black",
+ "Floral Chinoiserie / Dark Blue",
+ "Daintree / Aqua",
+ "Floral Elegance / Gray",
+ "Maranta Arrowroot / Pale Green",
+ "Floral Fantasy / Black"
+ ],
+ "caption": "New arrivals just landed ✨ Floral Fantasy, Venus, Floral Chinoiserie & more from Rebel Walls, Thibaut. Discover the latest wallcoverings — shop the collection at designerwallcoverings.com 🔗\n\n#DesignerWallcoverings #NewArrivals #Wallcovering #Wallcoverings #InteriorDesign #InteriorDecor #HomeDesign #LuxuryInteriors #DesignInspo #RebelWalls #Thibaut",
+ "hashtags": [
+ "#DesignerWallcoverings",
+ "#NewArrivals",
+ "#Wallcovering",
+ "#Wallcoverings",
+ "#InteriorDesign",
+ "#InteriorDecor",
+ "#HomeDesign",
+ "#LuxuryInteriors",
+ "#DesignInspo",
+ "#RebelWalls",
+ "#Thibaut"
+ ],
+ "publish": {
+ "instagram": {
+ "status": "pending"
+ },
+ "tiktok": {
+ "status": "pending"
+ }
+ }
+ },
+ {
+ "file": "new-arrivals-2026-07-17-14-10.mp4",
+ "created_at": "2026-07-17T14:10:32.356Z",
+ "products": 6,
+ "seconds": 19,
+ "titles": [
+ "Floral Fantasy / Soft Pink",
+ "Floral Fantasy / Pink",
+ "Floral Fantasy / Gray",
+ "Floral Fantasy / Black",
+ "Floral Elegance / Gray",
+ "Venus / Black"
+ ],
+ "caption": "New arrivals just landed ✨ Floral Fantasy, Floral Elegance, Venus from Rebel Walls, Thibaut. Discover the latest wallcoverings — shop the collection at designerwallcoverings.com 🔗\n\n#DesignerWallcoverings #NewArrivals #Wallpaper #Wallcovering #InteriorDesign #InteriorDecor #HomeDesign #LuxuryInteriors #DesignInspo #RebelWalls #Thibaut",
+ "hashtags": [
+ "#DesignerWallcoverings",
+ "#NewArrivals",
+ "#Wallpaper",
+ "#Wallcovering",
+ "#InteriorDesign",
+ "#InteriorDecor",
+ "#HomeDesign",
+ "#LuxuryInteriors",
+ "#DesignInspo",
+ "#RebelWalls",
+ "#Thibaut"
+ ],
+ "publish": {
+ "instagram": {
+ "status": "pending-creds",
+ "account": "dw",
+ "note": "Designer Wallcoverings @designerwallcoverings: IG_AGENT_AUTH not set (route via secrets skill)",
+ "at": "2026-07-17T14:10:32.402Z"
+ },
+ "tiktok": {
+ "status": "pending-reconnect",
+ "note": "TikTok channel not connected",
+ "at": "2026-07-17T14:10:32.402Z"
+ }
+ }
+ },
{
"file": "new-arrivals-2026-07-16-14-10.mp4",
"created_at": "2026-07-16T14:10:36.971Z",
diff --git a/data/video-jobs.json b/data/video-jobs.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/data/video-jobs.json
@@ -0,0 +1 @@
+[]
diff --git a/scripts/build-reel.mjs b/scripts/build-reel.mjs
index 88929be..a06b76b 100644
--- a/scripts/build-reel.mjs
+++ b/scripts/build-reel.mjs
@@ -46,7 +46,7 @@ function captionFor(items) {
+ `\n\n${THEME.captionTail}`;
const tagify = s => '#' + String(s).replace(/[^a-z0-9]+/gi, '');
const tags = [...new Set([
- '#DesignerWallcoverings', ...THEME.tagsExtra, '#Wallpaper', '#Wallcovering',
+ '#DesignerWallcoverings', ...THEME.tagsExtra, '#Wallcovering', '#Wallcoverings',
'#InteriorDesign', '#InteriorDecor', '#HomeDesign', '#LuxuryInteriors', '#DesignInspo',
...vendors.slice(0, 3).map(tagify),
])].slice(0, 14);
diff --git a/videos/dw-new-arrivals-reveal/.hyperframes/caption-skin.html b/videos/dw-new-arrivals-reveal/.hyperframes/caption-skin.html
new file mode 100644
index 0000000..135fa97
--- /dev/null
+++ b/videos/dw-new-arrivals-reveal/.hyperframes/caption-skin.html
@@ -0,0 +1,222 @@
+<!--
+ Cartesian — caption skin (preset-local source).
+
+ This is the preset's own lower-third karaoke caption look. product-launch-video's
+ Step 2 copies it into the project as caption-skin.html; captions.mjs then fills the
+ three reserved holes, wraps the fragment in a <template>, and writes
+ compositions/captions.html:
+ · the empty GROUPS array → the engine's scene-aware word groups
+ · the 0 duration + 0 width/height → real total + canvas size
+ · the empty data-brand-tokens style → :root tokens derived from the project's frame.md
+
+ Token contract — reference ONLY this fixed vocab (captions.mjs injects it from
+ frame.md, so the Step-2 brand overlay flows through; each var has a cartesian literal
+ fallback for standalone preview):
+ --cap-ink · --cap-canvas · --cap-accent · --cap-accent-2 · --font-display ·
+ --font-body · --cap-band-top · --cap-band-height
+ Hooks (do not rename): .caption-group / .caption-word + states .is-active / .is-spoken,
+ root data-composition-id="captions", timeline at window.__timelines["captions"].
+ State changes use gsap.set({className}) (applied on the engine's frame-by-frame seek);
+ never tl.call() callbacks (seek does not fire them → wrong state on render).
+
+ Visual: a museum-catalog lower-third — a warm-stone card on a single 1px taupe
+ hairline border (cartesian's universal structural device), SHARP corners, ZERO
+ shadow, ZERO fill beyond the stone canvas. Playfair Display 400, sentence case, ink
+ glyphs. Upcoming words sit in faint ink; the current word is marked QUIETLY — a faint
+ stone wash with a 1px taupe hairline underline (restraint, not a loud block); spoken
+ words settle to solid ink, the wash and underline cleared.
+-->
+<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
+
+<!-- captions.mjs injects the project's :root tokens here -->
+<style data-brand-tokens></style>
+
+<style>
+ #captions-root {
+ position: absolute;
+ inset: 0;
+ pointer-events: none;
+ }
+ .caption-layer {
+ position: absolute;
+ inset: 0;
+ z-index: 20;
+ pointer-events: none;
+ }
+ /* the keep-out band, from captionBand(H) — frame content stays above it */
+ .caption-stage {
+ position: absolute;
+ left: 0;
+ right: 0;
+ top: var(--cap-band-top, 900px);
+ height: var(--cap-band-height, 180px);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+ .caption-group {
+ /* every group is absolutely stacked over the SAME band — exactly one shown at a
+ time via opacity. Must be absolute: in-flow groups would lay out side-by-side. */
+ position: absolute;
+ inset: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ opacity: 0;
+ }
+
+ /* THE stone card — single 1px taupe hairline border (cartesian's universal
+ structural device), SHARP corners, ZERO shadow, ZERO fill beyond the stone canvas */
+ .caption-pill {
+ max-width: 78%;
+ padding: 20px 44px 24px;
+ background: var(--cap-canvas, #ede8e0);
+ border: 1px solid var(--cap-accent-2, #b8b0a4);
+ border-radius: 0;
+ }
+ .caption-line {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ gap: 0.1em 0.34em;
+ font-family: var(--font-display, "Playfair Display"), Georgia, serif;
+ font-weight: 400;
+ font-size: clamp(40px, 4.4vw, 58px);
+ line-height: 1.16;
+ letter-spacing: -0.01em;
+ }
+
+ /* upcoming — faint ink, no mark */
+ .caption-word {
+ display: inline-block;
+ padding: 0 0.06em;
+ border-bottom: 1px solid transparent;
+ color: color-mix(in srgb, var(--cap-ink, #1a1a1a) 42%, var(--cap-canvas, #ede8e0));
+ }
+ /* current word — a QUIET marker: a faint warm-stone wash behind solid ink, plus a
+ 1px taupe hairline underline (restraint, not a loud block; SHARP, NO shadow) */
+ .caption-word.is-active {
+ color: var(--cap-ink, #1a1a1a);
+ background: color-mix(in srgb, var(--cap-accent, #8a8178) 18%, var(--cap-canvas, #ede8e0));
+ border-bottom: 1px solid var(--cap-accent, #8a8178);
+ }
+ /* already spoken — solid ink, wash + underline cleared */
+ .caption-word.is-spoken {
+ color: var(--cap-ink, #1a1a1a);
+ background: transparent;
+ border-bottom: 1px solid transparent;
+ }
+
+ /* optional per-word accents (dormant until a word-classer tags them) */
+ /* brand / key term — Playfair Display italic, cartesian's only display inflection */
+ .caption-word.cap-brand {
+ font-style: italic;
+ }
+ /* numerals / data — the body sans voice, slightly recessed */
+ .caption-word.cap-num {
+ font-family: var(--font-body, "Inter"), ui-sans-serif, sans-serif;
+ color: color-mix(in srgb, var(--cap-ink, #1a1a1a) 72%, var(--cap-canvas, #ede8e0));
+ }
+ /* emphasis — a 1px taupe hairline underline (no second color; stone-and-ink only) */
+ .caption-word.cap-cta {
+ text-decoration: underline;
+ text-decoration-thickness: 1px;
+ text-decoration-color: var(--cap-accent, #8a8178);
+ text-underline-offset: 0.12em;
+ }
+
+ @media (max-aspect-ratio: 9/16) {
+ .caption-pill {
+ max-width: 92%;
+ }
+ .caption-line {
+ font-size: clamp(34px, 5.4vw, 48px);
+ }
+ }
+</style>
+
+<div
+ id="captions-root"
+ data-composition-id="captions"
+ data-timeline-locked
+ data-start="0"
+ data-duration="0"
+ data-fps="30"
+ data-width="0"
+ data-height="0"
+>
+ <div class="caption-layer" aria-hidden="true">
+ <div id="caption-stage" class="caption-stage"></div>
+ </div>
+</div>
+
+<script>
+ // captions.mjs injects the engine's scene-aware groups + real duration here.
+ var GROUPS = [];
+ var DURATION = 0;
+
+ (function () {
+ var stage = document.getElementById("caption-stage");
+
+ // build DOM: one .caption-group per group, .caption-word per word
+ GROUPS.forEach(function (group, g) {
+ var groupEl = document.createElement("div");
+ groupEl.className = "caption-group";
+ groupEl.id = "caption-group-" + g;
+ var pill = document.createElement("div");
+ pill.className = "caption-pill";
+ var line = document.createElement("div");
+ line.className = "caption-line";
+ (group.words || []).forEach(function (w, i) {
+ var span = document.createElement("span");
+ span.className = "caption-word";
+ span.id = "caption-word-" + g + "-" + i;
+ span.textContent = String(w.text);
+ line.appendChild(span);
+ });
+ pill.appendChild(line);
+ groupEl.appendChild(pill);
+ stage.appendChild(groupEl);
+ });
+
+ window.__timelines = window.__timelines || {};
+ var tl = gsap.timeline({ paused: true });
+
+ GROUPS.forEach(function (group, g) {
+ var groupEl = document.getElementById("caption-group-" + g);
+ var words = group.words || [];
+ var next = GROUPS[g + 1];
+ var isLast = g === GROUPS.length - 1;
+ var start = Math.max(0, Number(group.start));
+ var end = isLast ? DURATION : Math.min(Number(next.start), Number(group.end) + 0.3);
+ if (end <= start) end = start + 0.01;
+
+ // group on/off — exactly one group visible at a time
+ tl.set(groupEl, { opacity: 1 }, start);
+ tl.set(groupEl, { opacity: 0 }, end);
+
+ // 3-state karaoke via className SETS — seek-safe (gsap.set applies on the
+ // engine's frame-by-frame seek; .call callbacks would NOT fire).
+ words.forEach(function (w, i) {
+ var el = document.getElementById("caption-word-" + g + "-" + i);
+ var at = Math.max(start, Number(w.start));
+ tl.set(el, { className: "caption-word" }, start); // upcoming (also resets on reverse-seek)
+ tl.set(el, { className: "caption-word is-active" }, at); // current
+ tl.fromTo(el, { scale: 0.985 }, { scale: 1, duration: 0.2, ease: "power1.out" }, at);
+ if (i + 1 < words.length) {
+ var nextAt = Math.max(start, Number(words[i + 1].start));
+ tl.set(el, { className: "caption-word is-spoken" }, nextAt); // demote when next activates
+ }
+ });
+ if (words.length) {
+ var lastEl = document.getElementById("caption-word-" + g + "-" + (words.length - 1));
+ var lastSpoken = Math.min(end, Number(words[words.length - 1].end) + 0.1);
+ tl.set(lastEl, { className: "caption-word is-spoken" }, lastSpoken);
+ }
+ });
+
+ // full-span anchor so the sub-comp timeline spans the whole video
+ tl.to({}, { duration: DURATION }, 0);
+ window.__timelines["captions"] = tl;
+ })();
+</script>
diff --git a/videos/dw-new-arrivals-reveal/.media/preferences.json b/videos/dw-new-arrivals-reveal/.media/preferences.json
new file mode 100644
index 0000000..34e7511
--- /dev/null
+++ b/videos/dw-new-arrivals-reveal/.media/preferences.json
@@ -0,0 +1,48 @@
+{
+ "version": 1,
+ "preferences": {
+ "destination": {
+ "value": "instagram-reels",
+ "confirmed_in": [
+ "dw-new-arrivals-reveal"
+ ],
+ "updated_at": "2026-07-17T14:51:58.459Z"
+ },
+ "aspect": {
+ "value": "1080x1920",
+ "confirmed_in": [
+ "dw-new-arrivals-reveal"
+ ],
+ "updated_at": "2026-07-17T14:51:58.500Z"
+ },
+ "language": {
+ "value": "en",
+ "confirmed_in": [
+ "dw-new-arrivals-reveal"
+ ],
+ "updated_at": "2026-07-17T14:51:58.538Z"
+ },
+ "flow": {
+ "value": "automation",
+ "confirmed_in": [
+ "dw-new-arrivals-reveal"
+ ],
+ "updated_at": "2026-07-17T14:51:58.574Z"
+ },
+ "storyboard": {
+ "value": "no",
+ "confirmed_in": [
+ "dw-new-arrivals-reveal"
+ ],
+ "updated_at": "2026-07-17T14:51:58.612Z"
+ },
+ "style_preset.product-launch-video": {
+ "value": "cartesian",
+ "confirmed_in": [
+ "dw-new-arrivals-reveal"
+ ],
+ "updated_at": "2026-07-17T14:51:58.651Z"
+ }
+ },
+ "sightings": {}
+}
diff --git a/videos/dw-new-arrivals-reveal/AGENTS.md b/videos/dw-new-arrivals-reveal/AGENTS.md
new file mode 100644
index 0000000..a63562c
--- /dev/null
+++ b/videos/dw-new-arrivals-reveal/AGENTS.md
@@ -0,0 +1,93 @@
+# HyperFrames Composition Project
+
+## Skills — USE THESE FIRST
+
+**Always invoke the relevant skill before writing or modifying compositions.** Skills encode framework-specific patterns (e.g., `window.__timelines` registration, `data-*` attribute semantics, shader-compatible CSS rules) that are NOT in generic web docs. Skipping them produces broken compositions.
+
+**Doing anything with HyperFrames?** Start at `/hyperframes` — it tells you what HyperFrames can do and which skill or workflow handles your intent (make a video, TTS / BGM, prep footage, author / animate, render, install blocks), confirms your brief up front (the intent layer), and routes every "make me a…" request (a video, a deck, a composition port) to the right workflow. Read it first, especially when there's no project context to orient you. The workflows it routes to:
+
+- `/product-launch-video` — any **website** URL or brief / script → a product launch / SaaS / promo video, or a site tour / showcase featuring the site's own captured visuals.
+- `/faceless-explainer` — arbitrary text (topic / article / notes), **no URL, no website capture** → 60-90s faceless explainer.
+- `/embedded-captions` — an existing talking-head video (MP4) → the same footage with captions / subtitles added (rail + embed, or pure-cinematic embed); the footage itself is untouched.
+- `/talking-head-recut` — an existing talking-head / interview / podcast video (MP4) → the same footage **packaged with designed graphic overlays** (kinetic titles, lower-thirds, data callouts, pull-quotes, side panels, pip) synced to the transcript; the clip plays unchanged underneath. (Plain captions/subtitles → `/embedded-captions`.)
+- `/pr-to-video` — a GitHub PR (URL / `owner/repo#N` / "this PR") → 30-90s code-change explainer (changelog / feature reveal / fix / refactor).
+- `/motion-graphics` — a short (typically under 10s) design-led **motion graphic**, motion-is-the-message, no narration: kinetic type, a stat / number count-up, a chart, a logo sting, a lower-third / overlay, or an animated tweet / headline / captured-page highlight; rendered to MP4 or a transparent overlay. Longer / narrated / custom → `/general-video`.
+- `/music-to-video` — a **music track** (audio file, or video to pull audio from) → beat-synced video (lyric / slideshow / kinetic promo). Music drives pacing; user-supplied images / videos are cut onto the same beat grid.
+- `/slideshow` — a **presentation / pitch deck / interactive deck** — discrete slides, fragment reveals, branching, hotspot navigation, presenter mode. Output is a navigable deck, not a rendered video.
+- `/general-video` — fallback for any other video (title card, longer brand / sizzle reel, multi-scene montage, static loop, custom composition) and the home of **companion mode** — co-create with the full HyperFrames toolbox; the original hyperframes authoring flow, any length.
+
+**Porting an existing composition?** `/remotion-to-hyperframes` translates a Remotion (React) composition into HyperFrames HTML — a source migration, separate from the creation workflows above.
+
+The domain skills (`/hyperframes-core`, `/hyperframes-animation`, `/hyperframes-keyframes`, `/hyperframes-creative`, `/hyperframes-cli`, `/media-use`, `/hyperframes-registry`, `/figma`) and the full capability map live inside `/hyperframes` — it is the single source of truth for which skill handles which intent.
+
+> **Tailwind v4 projects** (`hyperframes init --tailwind`): see `/hyperframes-core` → `references/tailwind.md`.
+
+> **Skill missing or stale?** Run `npx hyperframes skills update <name>` to install/refresh
+> the specific skill you need (the `/hyperframes` router does this automatically before
+> entering a workflow), or bare `npx hyperframes skills update` to refresh the core set plus
+> everything already installed — neither pulls the full set. Restart the agent session so
+> newly installed skills load.
+
+## Commands
+
+```bash
+npm run dev # start the preview server (long-running — keep it alive in background)
+npm run check # lint + runtime + layout + motion + contrast (one command)
+npm run render # render to MP4
+npm run publish # publish and get a shareable link
+npx hyperframes lint --verbose # include info-level findings
+npx hyperframes lint --json # machine-readable output for CI
+npx hyperframes docs <topic> # reference docs in terminal
+```
+
+> **`npm run dev` is a long-running server, not a one-shot command.** It blocks until stopped.
+> In Claude Code, always run it with `run_in_background: true`. Never run it as a foreground
+> command — it will time out and the server will die, breaking the browser preview.
+
+> **Pinned CLI version.** These scripts pin an exact `hyperframes@X.Y.Z` so this project re-renders identically over time. Weeks later that pin lags fixes shipped since. To move up: `npx hyperframes@latest upgrade --project . --check` (shows the delta), then `npx hyperframes@latest upgrade --project .` to rewrite the pins. Always unpinned — the pinned script re-runs the old version against itself.
+
+## Documentation
+
+**For quick reference**, use the local CLI docs command (no network required):
+
+```bash
+npx hyperframes docs <topic>
+```
+
+Topics: `data-attributes`, `gsap`, `compositions`, `rendering`, `examples`, `troubleshooting`
+
+**For full documentation**, discover pages via the machine-readable index — do NOT guess URLs:
+
+```
+https://hyperframes.heygen.com/llms.txt
+```
+
+## Project Structure
+
+- `index.html` — main composition (root timeline)
+- `compositions/` — sub-compositions referenced via `data-composition-src`
+- `meta.json` — project metadata (id, name)
+- `transcript.json` — whisper word-level transcript (if generated)
+
+## Linting — ALWAYS RUN AFTER CHANGES
+
+After creating or editing any `.html` composition, **always** run the full check before considering the task complete:
+
+```bash
+npm run check
+```
+
+Fix all errors before presenting the result. Warnings should be reviewed before rendering.
+
+## Key Rules
+
+1. Every timed element needs `data-start`, `data-duration`, and `data-track-index`
+2. Elements with timing **MUST** have `class="clip"` — the framework uses this for visibility control
+3. Timelines must be paused and registered on `window.__timelines`:
+ ```js
+ window.__timelines = window.__timelines || {};
+ window.__timelines["composition-id"] = gsap.timeline({ paused: true });
+ ```
+4. Videos use `muted` with a separate `<audio>` element for the audio track
+5. Sub-compositions use `data-composition-src="compositions/file.html"` to reference other HTML files
+6. Only deterministic logic — no `Date.now()`, no `Math.random()`, no network fetches
diff --git a/videos/dw-new-arrivals-reveal/BRIEF.md b/videos/dw-new-arrivals-reveal/BRIEF.md
new file mode 100644
index 0000000..a6bc549
--- /dev/null
+++ b/videos/dw-new-arrivals-reveal/BRIEF.md
@@ -0,0 +1,54 @@
+---
+workflow: product-launch-video
+flow: automation
+storyboard: no
+message: "New-season wallcovering arrivals have landed — shop the reveal"
+destination: instagram-reels
+aspect: 1080x1920
+language: en
+audience: interior designers, trade professionals, and design-forward retail shoppers
+length: 45-55s
+angle: new-arrivals collection reveal
+style_preset: cartesian
+---
+
+## Intent
+
+A quiet-luxury "New Arrivals — Collection Reveal" promo Reel for Designer
+Wallcoverings. Editorial, to-the-trade credible, unhurried — the feel of a
+design house unveiling its new season rather than a sale. Serif display type,
+cream/ink/soft-accent palette. Structure is a collection reveal: a hook, a hero
+statement pattern, a cascade of the new patterns, and a close on the CTA.
+
+The source is Designer Wallcoverings' live New Arrivals collection (24 current
+new-arrival products). The video features the strongest, most visually-varied of
+these real, published patterns as its assets. These are existing live products —
+no settlement gate required.
+
+## Assets
+
+- capture/assets/floral-fantasy-soft-pink.jpg — Rebel Walls "Floral Fantasy", Soft Pink mural (pink/gray/black romantic florals) — the hero statement pattern. (1200x800)
+- capture/assets/venus-black-thibaut.jpg — Thibaut "Venus", Black — graphic ink-on-cream botanical, high-contrast. (1200x1200)
+- capture/assets/floral-elegance-gray.jpg — Rebel Walls "Floral Elegance", Gray — soft editorial floral. (1200x1376)
+- capture/assets/floral-chinoiserie-green.jpg — Rebel Walls "Floral Chinoiserie", Green — lush chinoiserie scenic. (1200x1432)
+- capture/assets/maranta-arrowroot-pale-green.jpg — Thibaut "Maranta Arrowroot", Pale Green — grasscloth-feel botanical.
+- capture/assets/daintree-bluemoon-thibaut.jpg — Thibaut "Daintree", Bluemoon — layered leaf motif, cool blue.
+- capture/assets/serengeti-aqua-thibaut.jpg — Thibaut "Serengeti", Aqua — animal-print texture, aqua.
+- capture/assets/gleniffer-black-and-grey.jpg — Thibaut "Gleniffer", Black and Grey — refined damask, monochrome.
+
+## Customizations
+
+- 9:16 Instagram Reels, 1080x1920.
+- Collection-reveal beat structure: hook → hero → feature cascade of patterns → CTA.
+- Closing CTA: "Shop New Arrivals at designerwallcoverings.com".
+
+## Notes
+
+- Brand voice: luxury, editorial, trade-credible. Designer Wallcoverings is both
+ to-the-trade and retail.
+- HARD RULE: never use the word "Wallpaper" anywhere (copy, captions, alt text,
+ narration). Always "Wallcovering" / "Wallcoverings".
+- Light cream accents: keep caption + wordmark contrast WCAG-safe (ink on cream,
+ never light-on-light).
+- Local audio only ($0): Kokoro TTS (default Marcia voice — omit --voice) +
+ MusicGen BGM via the tts-venv python.
diff --git a/videos/dw-new-arrivals-reveal/CLAUDE.md b/videos/dw-new-arrivals-reveal/CLAUDE.md
new file mode 100644
index 0000000..a63562c
--- /dev/null
+++ b/videos/dw-new-arrivals-reveal/CLAUDE.md
@@ -0,0 +1,93 @@
+# HyperFrames Composition Project
+
+## Skills — USE THESE FIRST
+
+**Always invoke the relevant skill before writing or modifying compositions.** Skills encode framework-specific patterns (e.g., `window.__timelines` registration, `data-*` attribute semantics, shader-compatible CSS rules) that are NOT in generic web docs. Skipping them produces broken compositions.
+
+**Doing anything with HyperFrames?** Start at `/hyperframes` — it tells you what HyperFrames can do and which skill or workflow handles your intent (make a video, TTS / BGM, prep footage, author / animate, render, install blocks), confirms your brief up front (the intent layer), and routes every "make me a…" request (a video, a deck, a composition port) to the right workflow. Read it first, especially when there's no project context to orient you. The workflows it routes to:
+
+- `/product-launch-video` — any **website** URL or brief / script → a product launch / SaaS / promo video, or a site tour / showcase featuring the site's own captured visuals.
+- `/faceless-explainer` — arbitrary text (topic / article / notes), **no URL, no website capture** → 60-90s faceless explainer.
+- `/embedded-captions` — an existing talking-head video (MP4) → the same footage with captions / subtitles added (rail + embed, or pure-cinematic embed); the footage itself is untouched.
+- `/talking-head-recut` — an existing talking-head / interview / podcast video (MP4) → the same footage **packaged with designed graphic overlays** (kinetic titles, lower-thirds, data callouts, pull-quotes, side panels, pip) synced to the transcript; the clip plays unchanged underneath. (Plain captions/subtitles → `/embedded-captions`.)
+- `/pr-to-video` — a GitHub PR (URL / `owner/repo#N` / "this PR") → 30-90s code-change explainer (changelog / feature reveal / fix / refactor).
+- `/motion-graphics` — a short (typically under 10s) design-led **motion graphic**, motion-is-the-message, no narration: kinetic type, a stat / number count-up, a chart, a logo sting, a lower-third / overlay, or an animated tweet / headline / captured-page highlight; rendered to MP4 or a transparent overlay. Longer / narrated / custom → `/general-video`.
+- `/music-to-video` — a **music track** (audio file, or video to pull audio from) → beat-synced video (lyric / slideshow / kinetic promo). Music drives pacing; user-supplied images / videos are cut onto the same beat grid.
+- `/slideshow` — a **presentation / pitch deck / interactive deck** — discrete slides, fragment reveals, branching, hotspot navigation, presenter mode. Output is a navigable deck, not a rendered video.
+- `/general-video` — fallback for any other video (title card, longer brand / sizzle reel, multi-scene montage, static loop, custom composition) and the home of **companion mode** — co-create with the full HyperFrames toolbox; the original hyperframes authoring flow, any length.
+
+**Porting an existing composition?** `/remotion-to-hyperframes` translates a Remotion (React) composition into HyperFrames HTML — a source migration, separate from the creation workflows above.
+
+The domain skills (`/hyperframes-core`, `/hyperframes-animation`, `/hyperframes-keyframes`, `/hyperframes-creative`, `/hyperframes-cli`, `/media-use`, `/hyperframes-registry`, `/figma`) and the full capability map live inside `/hyperframes` — it is the single source of truth for which skill handles which intent.
+
+> **Tailwind v4 projects** (`hyperframes init --tailwind`): see `/hyperframes-core` → `references/tailwind.md`.
+
+> **Skill missing or stale?** Run `npx hyperframes skills update <name>` to install/refresh
+> the specific skill you need (the `/hyperframes` router does this automatically before
+> entering a workflow), or bare `npx hyperframes skills update` to refresh the core set plus
+> everything already installed — neither pulls the full set. Restart the agent session so
+> newly installed skills load.
+
+## Commands
+
+```bash
+npm run dev # start the preview server (long-running — keep it alive in background)
+npm run check # lint + runtime + layout + motion + contrast (one command)
+npm run render # render to MP4
+npm run publish # publish and get a shareable link
+npx hyperframes lint --verbose # include info-level findings
+npx hyperframes lint --json # machine-readable output for CI
+npx hyperframes docs <topic> # reference docs in terminal
+```
+
+> **`npm run dev` is a long-running server, not a one-shot command.** It blocks until stopped.
+> In Claude Code, always run it with `run_in_background: true`. Never run it as a foreground
+> command — it will time out and the server will die, breaking the browser preview.
+
+> **Pinned CLI version.** These scripts pin an exact `hyperframes@X.Y.Z` so this project re-renders identically over time. Weeks later that pin lags fixes shipped since. To move up: `npx hyperframes@latest upgrade --project . --check` (shows the delta), then `npx hyperframes@latest upgrade --project .` to rewrite the pins. Always unpinned — the pinned script re-runs the old version against itself.
+
+## Documentation
+
+**For quick reference**, use the local CLI docs command (no network required):
+
+```bash
+npx hyperframes docs <topic>
+```
+
+Topics: `data-attributes`, `gsap`, `compositions`, `rendering`, `examples`, `troubleshooting`
+
+**For full documentation**, discover pages via the machine-readable index — do NOT guess URLs:
+
+```
+https://hyperframes.heygen.com/llms.txt
+```
+
+## Project Structure
+
+- `index.html` — main composition (root timeline)
+- `compositions/` — sub-compositions referenced via `data-composition-src`
+- `meta.json` — project metadata (id, name)
+- `transcript.json` — whisper word-level transcript (if generated)
+
+## Linting — ALWAYS RUN AFTER CHANGES
+
+After creating or editing any `.html` composition, **always** run the full check before considering the task complete:
+
+```bash
+npm run check
+```
+
+Fix all errors before presenting the result. Warnings should be reviewed before rendering.
+
+## Key Rules
+
+1. Every timed element needs `data-start`, `data-duration`, and `data-track-index`
+2. Elements with timing **MUST** have `class="clip"` — the framework uses this for visibility control
+3. Timelines must be paused and registered on `window.__timelines`:
+ ```js
+ window.__timelines = window.__timelines || {};
+ window.__timelines["composition-id"] = gsap.timeline({ paused: true });
+ ```
+4. Videos use `muted` with a separate `<audio>` element for the audio track
+5. Sub-compositions use `data-composition-src="compositions/file.html"` to reference other HTML files
+6. Only deterministic logic — no `Date.now()`, no `Math.random()`, no network fetches
diff --git a/videos/dw-new-arrivals-reveal/SCRIPT.md b/videos/dw-new-arrivals-reveal/SCRIPT.md
new file mode 100644
index 0000000..4caaaa1
--- /dev/null
+++ b/videos/dw-new-arrivals-reveal/SCRIPT.md
@@ -0,0 +1,64 @@
+# SCRIPT — dw-new-arrivals-reveal
+
+**Voice:** Marcia (Kokoro, local — default; --voice omitted)
+**Voice settings:** default
+**Voice direction:** Warm, poised, editorial. Unhurried luxury — a design house
+unveiling its new season, never a hard sell. Even, quiet confidence.
+
+---
+
+## Line 1 — Hook (Frame 1)
+
+**Time:** 0.0 – 4.0s
+**Delivery:** Settle in; land the promise gently.
+
+ The new season has arrived.
+
+## Line 2 — Hero reveal (Frame 2)
+
+**Time:** 4.0 – 11.0s
+**Delivery:** Present the flagship with a little reverence.
+
+ Leading the collection: Floral Fantasy from Rebel Walls — a full-wall mural in soft pink, gray, and black.
+
+## Line 3 — Venus (Frame 3)
+
+**Time:** 11.0 – 16.0s
+**Delivery:** Crisp, confident.
+
+ Venus, in graphic black — a bold botanical from Thibaut.
+
+## Line 4 — Florals (Frame 4)
+
+**Time:** 16.0 – 21.0s
+**Delivery:** Flowing, painterly.
+
+ Floral Chinoiserie in green, and Floral Elegance in gray — painterly murals from Rebel Walls.
+
+## Line 5 — Botanicals (Frame 5)
+
+**Time:** 21.0 – 26.0s
+**Delivery:** Calmer, cooler.
+
+ Maranta Arrowroot in pale green, and Daintree in bluemoon — layered botanicals from Thibaut.
+
+## Line 6 — Texture (Frame 6)
+
+**Time:** 26.0 – 31.0s
+**Delivery:** Assured, tie the pair together.
+
+ Serengeti in aqua, and the refined Gleniffer damask — texture and structure, both new from Thibaut.
+
+## Line 7 — Range (Frame 7)
+
+**Time:** 31.0 – 35.0s
+**Delivery:** Warm, summarizing.
+
+ Murals, grasscloths, and statement patterns — the season's newest, all in one place.
+
+## Line 8 — CTA (Frame 8)
+
+**Time:** 35.0 – 40.0s
+**Delivery:** Clear, inviting; land the domain cleanly.
+
+ Shop new arrivals at designer wallcoverings dot com.
diff --git a/videos/dw-new-arrivals-reveal/STORYBOARD.md b/videos/dw-new-arrivals-reveal/STORYBOARD.md
new file mode 100644
index 0000000..aef07eb
--- /dev/null
+++ b/videos/dw-new-arrivals-reveal/STORYBOARD.md
@@ -0,0 +1,127 @@
+---
+format: 1080x1920
+message: "New-season wallcovering arrivals have landed — shop the reveal"
+arc: Hook → Hero reveal → Feature cascade → CTA
+audience: interior designers, trade professionals, and design-forward retail shoppers
+mode: autonomous
+music: elegant
+---
+
+## Frame 1 — Hook
+
+- scene: Cormorant display title fades up on stone paper; a compass ring drifts in
+- duration: 4s
+- poster: 3s
+- transition_in: cut
+- status: outline
+- voiceover: "The new season has arrived."
+- asset_candidates: none (typographic cover)
+- src: compositions/frames/01-hook.html
+
+Open cold on the promise, purely typographic. Taupe label eyebrow "NEW ARRIVALS", a
+two-line Cormorant display headline in ink ("The new season / has arrived"), one faint
+compass ring behind. Quiet, editorial, unhurried — a design house opening its doors, not
+a sale. Sets the whole tone.
+
+## Frame 2 — Hero reveal
+
+- scene: Full-bleed Floral Fantasy mural rises behind a thin ink caption plate
+- duration: 7s
+- poster: 4s
+- transition_in: crossfade
+- status: outline
+- voiceover: "Leading the collection: Floral Fantasy from Rebel Walls — a full-wall mural in soft pink, gray, and black."
+- asset_candidates: capture/assets/floral-fantasy-soft-pink.jpg
+- src: compositions/frames/02-hero.html
+
+The statement piece. The pink/gray/black romantic floral mural fills the frame with a
+slow Ken-Burns push. A hairline-framed caption block, lower third, ink-on-cream:
+"Floral Fantasy · Rebel Walls". This is the flagship visual — give it room to breathe.
+
+## Frame 3 — Cascade: Venus
+
+- scene: Venus swatch settles into a hairline-framed portrait card, label beside it
+- duration: 5s
+- poster: 3s
+- transition_in: wipe
+- status: outline
+- voiceover: "Venus, in graphic black — a bold botanical from Thibaut."
+- asset_candidates: capture/assets/venus-black-thibaut.jpg
+- src: compositions/frames/03-venus.html
+
+Begin the feature cascade. Off-center portrait image on the right in a 1px taupe frame,
+Cormorant pattern name + taupe attribution on the left. High-contrast ink-on-cream keeps
+the eye moving.
+
+## Frame 4 — Cascade: Chinoiserie & Elegance
+
+- scene: Two floral panels slide in stacked, each with a hairline label
+- duration: 5s
+- poster: 3s
+- transition_in: crossfade
+- status: outline
+- voiceover: "Floral Chinoiserie in green, and Floral Elegance in gray — painterly murals from Rebel Walls."
+- asset_candidates: capture/assets/floral-chinoiserie-green.jpg, capture/assets/floral-elegance-gray.jpg
+- src: compositions/frames/04-florals.html
+
+Two-up beat to build pace. Two mural panels stacked or side-by-side, each in a taupe
+hairline frame with a small Cormorant caption. Lush green chinoiserie against soft gray
+floral — variety of mood in one breath.
+
+## Frame 5 — Cascade: Botanicals
+
+- scene: Maranta and Daintree swatches enter with staggered timing
+- duration: 5s
+- poster: 3s
+- transition_in: wipe
+- status: outline
+- voiceover: "Maranta Arrowroot in pale green, and Daintree in bluemoon — layered botanicals from Thibaut."
+- asset_candidates: capture/assets/maranta-arrowroot-pale-green.jpg, capture/assets/daintree-bluemoon-thibaut.jpg
+- src: compositions/frames/05-botanicals.html
+
+The tonal, textural beat. Two calmer swatches — grasscloth-feel arrowroot and cool
+bluemoon leaf motif — each hairline-framed with a Cormorant name. Cool, quiet greens and
+blues after the drama.
+
+## Frame 6 — Cascade: Serengeti & Gleniffer
+
+- scene: Serengeti and Gleniffer settle in; a taupe rule ties the pair
+- duration: 5s
+- poster: 3s
+- transition_in: crossfade
+- status: outline
+- voiceover: "Serengeti in aqua, and the refined Gleniffer damask — texture and structure, both new from Thibaut."
+- asset_candidates: capture/assets/serengeti-aqua-thibaut.jpg, capture/assets/gleniffer-black-and-grey.jpg
+- src: compositions/frames/06-texture.html
+
+Close the cascade on contrast: aqua animal-print texture against a black-and-grey damask.
+Two hairline-framed swatches with Cormorant names, a single taupe rule beneath tying them.
+
+## Frame 7 — Range line
+
+- scene: A short taupe rule; a Cormorant line naming the season's breadth
+- duration: 4s
+- poster: 3s
+- transition_in: crossfade
+- status: outline
+- voiceover: "Murals, grasscloths, and statement patterns — the season's newest, all in one place."
+- asset_candidates: none (typographic bridge)
+- src: compositions/frames/07-range.html
+
+A quiet typographic breath before the CTA. One centered Cormorant line over a taupe rule,
+restating the range. No imagery — let the patterns just shown do the memory work.
+
+## Frame 8 — CTA
+
+- scene: Centered Cormorant sign-off inside the largest compass ring; one ink accent line; the URL
+- duration: 5s
+- poster: 3s
+- transition_in: crossfade
+- status: outline
+- voiceover: "Shop new arrivals at designerwallcoverings.com."
+- asset_candidates: none (typographic closer)
+- src: compositions/frames/08-cta.html
+
+The closing plate. Centered Cormorant "Shop New Arrivals" inside the largest compass ring,
+a short ink horizontal-accent beneath, then the URL "designerwallcoverings.com" in tracked
+taupe. The one clear next step.
diff --git a/videos/dw-new-arrivals-reveal/assets/fonts/cormorant-400.woff2 b/videos/dw-new-arrivals-reveal/assets/fonts/cormorant-400.woff2
new file mode 100644
index 0000000..9be8870
Binary files /dev/null and b/videos/dw-new-arrivals-reveal/assets/fonts/cormorant-400.woff2 differ
diff --git a/videos/dw-new-arrivals-reveal/assets/fonts/cormorant-500.woff2 b/videos/dw-new-arrivals-reveal/assets/fonts/cormorant-500.woff2
new file mode 100644
index 0000000..12aa705
Binary files /dev/null and b/videos/dw-new-arrivals-reveal/assets/fonts/cormorant-500.woff2 differ
diff --git a/videos/dw-new-arrivals-reveal/assets/fonts/cormorant-600.woff2 b/videos/dw-new-arrivals-reveal/assets/fonts/cormorant-600.woff2
new file mode 100644
index 0000000..88ec261
Binary files /dev/null and b/videos/dw-new-arrivals-reveal/assets/fonts/cormorant-600.woff2 differ
diff --git a/videos/dw-new-arrivals-reveal/assets/fonts/cormorant-italic-400.woff2 b/videos/dw-new-arrivals-reveal/assets/fonts/cormorant-italic-400.woff2
new file mode 100644
index 0000000..68922f7
Binary files /dev/null and b/videos/dw-new-arrivals-reveal/assets/fonts/cormorant-italic-400.woff2 differ
diff --git a/videos/dw-new-arrivals-reveal/assets/voice/01.wav b/videos/dw-new-arrivals-reveal/assets/voice/01.wav
new file mode 100644
index 0000000..4aaf62e
Binary files /dev/null and b/videos/dw-new-arrivals-reveal/assets/voice/01.wav differ
diff --git a/videos/dw-new-arrivals-reveal/assets/voice/02.wav b/videos/dw-new-arrivals-reveal/assets/voice/02.wav
new file mode 100644
index 0000000..d7c8b39
Binary files /dev/null and b/videos/dw-new-arrivals-reveal/assets/voice/02.wav differ
diff --git a/videos/dw-new-arrivals-reveal/assets/voice/03.wav b/videos/dw-new-arrivals-reveal/assets/voice/03.wav
new file mode 100644
index 0000000..6dd5816
Binary files /dev/null and b/videos/dw-new-arrivals-reveal/assets/voice/03.wav differ
diff --git a/videos/dw-new-arrivals-reveal/assets/voice/04.wav b/videos/dw-new-arrivals-reveal/assets/voice/04.wav
new file mode 100644
index 0000000..b085eec
Binary files /dev/null and b/videos/dw-new-arrivals-reveal/assets/voice/04.wav differ
diff --git a/videos/dw-new-arrivals-reveal/assets/voice/05.wav b/videos/dw-new-arrivals-reveal/assets/voice/05.wav
new file mode 100644
index 0000000..6f1e3da
Binary files /dev/null and b/videos/dw-new-arrivals-reveal/assets/voice/05.wav differ
diff --git a/videos/dw-new-arrivals-reveal/assets/voice/06.wav b/videos/dw-new-arrivals-reveal/assets/voice/06.wav
new file mode 100644
index 0000000..70f0611
Binary files /dev/null and b/videos/dw-new-arrivals-reveal/assets/voice/06.wav differ
diff --git a/videos/dw-new-arrivals-reveal/assets/voice/07.wav b/videos/dw-new-arrivals-reveal/assets/voice/07.wav
new file mode 100644
index 0000000..9b7d4b0
Binary files /dev/null and b/videos/dw-new-arrivals-reveal/assets/voice/07.wav differ
diff --git a/videos/dw-new-arrivals-reveal/assets/voice/08.wav b/videos/dw-new-arrivals-reveal/assets/voice/08.wav
new file mode 100644
index 0000000..0271be9
Binary files /dev/null and b/videos/dw-new-arrivals-reveal/assets/voice/08.wav differ
diff --git a/videos/dw-new-arrivals-reveal/audio_engine_meta.json b/videos/dw-new-arrivals-reveal/audio_engine_meta.json
new file mode 100644
index 0000000..6a146de
--- /dev/null
+++ b/videos/dw-new-arrivals-reveal/audio_engine_meta.json
@@ -0,0 +1,454 @@
+{
+ "tts_provider": "kokoro",
+ "voice_id": "am_michael",
+ "bgm": null,
+ "bgm_pending": false,
+ "bgm_provider": null,
+ "bgm_pid": null,
+ "bgm_log": null,
+ "bgm_mode": null,
+ "bgm_target_duration_s": null,
+ "bgm_seed_duration_s": null,
+ "bgm_loop_count": null,
+ "voices": [
+ {
+ "id": "01",
+ "path": "assets/voice/01.wav",
+ "duration_s": 1.835,
+ "words": []
+ },
+ {
+ "id": "02",
+ "path": "assets/voice/02.wav",
+ "duration_s": 7.189,
+ "words": [
+ {
+ "id": "w0",
+ "text": "leading",
+ "start": 0.08,
+ "end": 0.41
+ },
+ {
+ "id": "w1",
+ "text": "the",
+ "start": 0.47,
+ "end": 0.63
+ },
+ {
+ "id": "w2",
+ "text": "collection,",
+ "start": 0.63,
+ "end": 1.42
+ },
+ {
+ "id": "w3",
+ "text": "Floral",
+ "start": 1.51,
+ "end": 1.78
+ },
+ {
+ "id": "w4",
+ "text": "Fantasy",
+ "start": 1.93,
+ "end": 2.39
+ },
+ {
+ "id": "w5",
+ "text": "from",
+ "start": 2.48,
+ "end": 2.78
+ },
+ {
+ "id": "w6",
+ "text": "Rebel",
+ "start": 2.78,
+ "end": 3.25
+ },
+ {
+ "id": "w7",
+ "text": "Walls,",
+ "start": 3.25,
+ "end": 3.8
+ },
+ {
+ "id": "w8",
+ "text": "a",
+ "start": 3.87,
+ "end": 3.92
+ },
+ {
+ "id": "w9",
+ "text": "full-wall",
+ "start": 3.92,
+ "end": 4.56
+ },
+ {
+ "id": "w10",
+ "text": "mural",
+ "start": 4.56,
+ "end": 5.02
+ },
+ {
+ "id": "w11",
+ "text": "in",
+ "start": 5.04,
+ "end": 5.2
+ },
+ {
+ "id": "w12",
+ "text": "soft",
+ "start": 5.2,
+ "end": 5.49
+ },
+ {
+ "id": "w13",
+ "text": "pink,",
+ "start": 5.59,
+ "end": 5.97
+ },
+ {
+ "id": "w14",
+ "text": "gray,",
+ "start": 6.18,
+ "end": 6.48
+ },
+ {
+ "id": "w15",
+ "text": "and",
+ "start": 6.48,
+ "end": 6.75
+ },
+ {
+ "id": "w16",
+ "text": "black.",
+ "start": 6.75,
+ "end": 7.18
+ }
+ ]
+ },
+ {
+ "id": "03",
+ "path": "assets/voice/03.wav",
+ "duration_s": 3.883,
+ "words": []
+ },
+ {
+ "id": "04",
+ "path": "assets/voice/04.wav",
+ "duration_s": 6.869,
+ "words": []
+ },
+ {
+ "id": "05",
+ "path": "assets/voice/05.wav",
+ "duration_s": 6.123,
+ "words": [
+ {
+ "id": "w0",
+ "text": "Maranta",
+ "start": 0.04,
+ "end": 0.46
+ },
+ {
+ "id": "w1",
+ "text": "Arrowroot",
+ "start": 0.46,
+ "end": 1.37
+ },
+ {
+ "id": "w2",
+ "text": "in",
+ "start": 1.43,
+ "end": 1.62
+ },
+ {
+ "id": "w3",
+ "text": "Pale",
+ "start": 1.62,
+ "end": 2.04
+ },
+ {
+ "id": "w4",
+ "text": "Green,",
+ "start": 2.04,
+ "end": 2.64
+ },
+ {
+ "id": "w5",
+ "text": "and",
+ "start": 2.67,
+ "end": 2.88
+ },
+ {
+ "id": "w6",
+ "text": "Daintree",
+ "start": 2.88,
+ "end": 3.5
+ },
+ {
+ "id": "w7",
+ "text": "in",
+ "start": 3.5,
+ "end": 3.66
+ },
+ {
+ "id": "w8",
+ "text": "Blue",
+ "start": 3.66,
+ "end": 3.91
+ },
+ {
+ "id": "w9",
+ "text": "Moon,",
+ "start": 3.98,
+ "end": 4.42
+ },
+ {
+ "id": "w10",
+ "text": "layered",
+ "start": 4.42,
+ "end": 4.78
+ },
+ {
+ "id": "w11",
+ "text": "botanicals",
+ "start": 4.78,
+ "end": 5.32
+ },
+ {
+ "id": "w12",
+ "text": "from",
+ "start": 5.32,
+ "end": 5.5
+ },
+ {
+ "id": "w13",
+ "text": "Thibbout.",
+ "start": 5.5,
+ "end": 5.91
+ }
+ ]
+ },
+ {
+ "id": "06",
+ "path": "assets/voice/06.wav",
+ "duration_s": 6.507,
+ "words": [
+ {
+ "id": "w0",
+ "text": "Serengeti",
+ "start": 0.07,
+ "end": 0.83
+ },
+ {
+ "id": "w1",
+ "text": "and",
+ "start": 0.91,
+ "end": 1.21
+ },
+ {
+ "id": "w2",
+ "text": "Aqua,",
+ "start": 1.21,
+ "end": 1.75
+ },
+ {
+ "id": "w3",
+ "text": "and",
+ "start": 1.75,
+ "end": 1.92
+ },
+ {
+ "id": "w4",
+ "text": "the",
+ "start": 1.92,
+ "end": 1.99
+ },
+ {
+ "id": "w5",
+ "text": "refined",
+ "start": 2.13,
+ "end": 2.52
+ },
+ {
+ "id": "w6",
+ "text": "Glenifer",
+ "start": 2.52,
+ "end": 3.16
+ },
+ {
+ "id": "w7",
+ "text": "damask",
+ "start": 3.16,
+ "end": 3.59
+ },
+ {
+ "id": "w8",
+ "text": "texture",
+ "start": 3.7,
+ "end": 4.16
+ },
+ {
+ "id": "w9",
+ "text": "and",
+ "start": 4.16,
+ "end": 4.31
+ },
+ {
+ "id": "w10",
+ "text": "structure,",
+ "start": 4.38,
+ "end": 5.13
+ },
+ {
+ "id": "w11",
+ "text": "both",
+ "start": 5.23,
+ "end": 5.42
+ },
+ {
+ "id": "w12",
+ "text": "new",
+ "start": 5.53,
+ "end": 5.63
+ },
+ {
+ "id": "w13",
+ "text": "from",
+ "start": 5.63,
+ "end": 5.92
+ },
+ {
+ "id": "w14",
+ "text": "Thibbout.",
+ "start": 5.99,
+ "end": 6.42
+ }
+ ]
+ },
+ {
+ "id": "07",
+ "path": "assets/voice/07.wav",
+ "duration_s": 5.483,
+ "words": [
+ {
+ "id": "w0",
+ "text": "murals,",
+ "start": 0.06,
+ "end": 0.52
+ },
+ {
+ "id": "w1",
+ "text": "grass",
+ "start": 0.52,
+ "end": 0.87
+ },
+ {
+ "id": "w2",
+ "text": "cloths",
+ "start": 0.87,
+ "end": 1.24
+ },
+ {
+ "id": "w3",
+ "text": "and",
+ "start": 1.31,
+ "end": 1.47
+ },
+ {
+ "id": "w4",
+ "text": "statement",
+ "start": 1.47,
+ "end": 2.09
+ },
+ {
+ "id": "w5",
+ "text": "patterns,",
+ "start": 2.09,
+ "end": 2.76
+ },
+ {
+ "id": "w6",
+ "text": "the",
+ "start": 2.82,
+ "end": 2.88
+ },
+ {
+ "id": "w7",
+ "text": "season's",
+ "start": 2.88,
+ "end": 3.67
+ },
+ {
+ "id": "w8",
+ "text": "newest,",
+ "start": 3.67,
+ "end": 4.4
+ },
+ {
+ "id": "w9",
+ "text": "all",
+ "start": 4.4,
+ "end": 4.58
+ },
+ {
+ "id": "w10",
+ "text": "in",
+ "start": 4.58,
+ "end": 4.71
+ },
+ {
+ "id": "w11",
+ "text": "one",
+ "start": 4.71,
+ "end": 4.92
+ },
+ {
+ "id": "w12",
+ "text": "place.",
+ "start": 4.92,
+ "end": 5.44
+ }
+ ]
+ },
+ {
+ "id": "08",
+ "path": "assets/voice/08.wav",
+ "duration_s": 3.499,
+ "words": [
+ {
+ "id": "w0",
+ "text": "Shop",
+ "start": 0.07,
+ "end": 0.3
+ },
+ {
+ "id": "w1",
+ "text": "new",
+ "start": 0.41,
+ "end": 0.54
+ },
+ {
+ "id": "w2",
+ "text": "arrivals",
+ "start": 0.54,
+ "end": 1.15
+ },
+ {
+ "id": "w3",
+ "text": "at",
+ "start": 1.15,
+ "end": 1.31
+ },
+ {
+ "id": "w4",
+ "text": "designerwallcoverings.com",
+ "start": 1.31,
+ "end": 3.26
+ }
+ ]
+ }
+ ],
+ "sfx": [],
+ "total_duration_s": 41.388
+}
\ No newline at end of file
diff --git a/videos/dw-new-arrivals-reveal/audio_meta.json b/videos/dw-new-arrivals-reveal/audio_meta.json
new file mode 100644
index 0000000..04b8414
--- /dev/null
+++ b/videos/dw-new-arrivals-reveal/audio_meta.json
@@ -0,0 +1,443 @@
+{
+ "bgm": null,
+ "voices": [
+ {
+ "frame": 1,
+ "path": "assets/voice/01.wav",
+ "duration_s": 1.835,
+ "words": []
+ },
+ {
+ "frame": 2,
+ "path": "assets/voice/02.wav",
+ "duration_s": 7.189,
+ "words": [
+ {
+ "id": "w0",
+ "text": "leading",
+ "start": 0.08,
+ "end": 0.41
+ },
+ {
+ "id": "w1",
+ "text": "the",
+ "start": 0.47,
+ "end": 0.63
+ },
+ {
+ "id": "w2",
+ "text": "collection,",
+ "start": 0.63,
+ "end": 1.42
+ },
+ {
+ "id": "w3",
+ "text": "Floral",
+ "start": 1.51,
+ "end": 1.78
+ },
+ {
+ "id": "w4",
+ "text": "Fantasy",
+ "start": 1.93,
+ "end": 2.39
+ },
+ {
+ "id": "w5",
+ "text": "from",
+ "start": 2.48,
+ "end": 2.78
+ },
+ {
+ "id": "w6",
+ "text": "Rebel",
+ "start": 2.78,
+ "end": 3.25
+ },
+ {
+ "id": "w7",
+ "text": "Walls,",
+ "start": 3.25,
+ "end": 3.8
+ },
+ {
+ "id": "w8",
+ "text": "a",
+ "start": 3.87,
+ "end": 3.92
+ },
+ {
+ "id": "w9",
+ "text": "full-wall",
+ "start": 3.92,
+ "end": 4.56
+ },
+ {
+ "id": "w10",
+ "text": "mural",
+ "start": 4.56,
+ "end": 5.02
+ },
+ {
+ "id": "w11",
+ "text": "in",
+ "start": 5.04,
+ "end": 5.2
+ },
+ {
+ "id": "w12",
+ "text": "soft",
+ "start": 5.2,
+ "end": 5.49
+ },
+ {
+ "id": "w13",
+ "text": "pink,",
+ "start": 5.59,
+ "end": 5.97
+ },
+ {
+ "id": "w14",
+ "text": "gray,",
+ "start": 6.18,
+ "end": 6.48
+ },
+ {
+ "id": "w15",
+ "text": "and",
+ "start": 6.48,
+ "end": 6.75
+ },
+ {
+ "id": "w16",
+ "text": "black.",
+ "start": 6.75,
+ "end": 7.18
+ }
+ ]
+ },
+ {
+ "frame": 3,
+ "path": "assets/voice/03.wav",
+ "duration_s": 3.883,
+ "words": []
+ },
+ {
+ "frame": 4,
+ "path": "assets/voice/04.wav",
+ "duration_s": 6.869,
+ "words": []
+ },
+ {
+ "frame": 5,
+ "path": "assets/voice/05.wav",
+ "duration_s": 6.123,
+ "words": [
+ {
+ "id": "w0",
+ "text": "Maranta",
+ "start": 0.04,
+ "end": 0.46
+ },
+ {
+ "id": "w1",
+ "text": "Arrowroot",
+ "start": 0.46,
+ "end": 1.37
+ },
+ {
+ "id": "w2",
+ "text": "in",
+ "start": 1.43,
+ "end": 1.62
+ },
+ {
+ "id": "w3",
+ "text": "Pale",
+ "start": 1.62,
+ "end": 2.04
+ },
+ {
+ "id": "w4",
+ "text": "Green,",
+ "start": 2.04,
+ "end": 2.64
+ },
+ {
+ "id": "w5",
+ "text": "and",
+ "start": 2.67,
+ "end": 2.88
+ },
+ {
+ "id": "w6",
+ "text": "Daintree",
+ "start": 2.88,
+ "end": 3.5
+ },
+ {
+ "id": "w7",
+ "text": "in",
+ "start": 3.5,
+ "end": 3.66
+ },
+ {
+ "id": "w8",
+ "text": "Blue",
+ "start": 3.66,
+ "end": 3.91
+ },
+ {
+ "id": "w9",
+ "text": "Moon,",
+ "start": 3.98,
+ "end": 4.42
+ },
+ {
+ "id": "w10",
+ "text": "layered",
+ "start": 4.42,
+ "end": 4.78
+ },
+ {
+ "id": "w11",
+ "text": "botanicals",
+ "start": 4.78,
+ "end": 5.32
+ },
+ {
+ "id": "w12",
+ "text": "from",
+ "start": 5.32,
+ "end": 5.5
+ },
+ {
+ "id": "w13",
+ "text": "Thibbout.",
+ "start": 5.5,
+ "end": 5.91
+ }
+ ]
+ },
+ {
+ "frame": 6,
+ "path": "assets/voice/06.wav",
+ "duration_s": 6.507,
+ "words": [
+ {
+ "id": "w0",
+ "text": "Serengeti",
+ "start": 0.07,
+ "end": 0.83
+ },
+ {
+ "id": "w1",
+ "text": "and",
+ "start": 0.91,
+ "end": 1.21
+ },
+ {
+ "id": "w2",
+ "text": "Aqua,",
+ "start": 1.21,
+ "end": 1.75
+ },
+ {
+ "id": "w3",
+ "text": "and",
+ "start": 1.75,
+ "end": 1.92
+ },
+ {
+ "id": "w4",
+ "text": "the",
+ "start": 1.92,
+ "end": 1.99
+ },
+ {
+ "id": "w5",
+ "text": "refined",
+ "start": 2.13,
+ "end": 2.52
+ },
+ {
+ "id": "w6",
+ "text": "Glenifer",
+ "start": 2.52,
+ "end": 3.16
+ },
+ {
+ "id": "w7",
+ "text": "damask",
+ "start": 3.16,
+ "end": 3.59
+ },
+ {
+ "id": "w8",
+ "text": "texture",
+ "start": 3.7,
+ "end": 4.16
+ },
+ {
+ "id": "w9",
+ "text": "and",
+ "start": 4.16,
+ "end": 4.31
+ },
+ {
+ "id": "w10",
+ "text": "structure,",
+ "start": 4.38,
+ "end": 5.13
+ },
+ {
+ "id": "w11",
+ "text": "both",
+ "start": 5.23,
+ "end": 5.42
+ },
+ {
+ "id": "w12",
+ "text": "new",
+ "start": 5.53,
+ "end": 5.63
+ },
+ {
+ "id": "w13",
+ "text": "from",
+ "start": 5.63,
+ "end": 5.92
+ },
+ {
+ "id": "w14",
+ "text": "Thibbout.",
+ "start": 5.99,
+ "end": 6.42
+ }
+ ]
+ },
+ {
+ "frame": 7,
+ "path": "assets/voice/07.wav",
+ "duration_s": 5.483,
+ "words": [
+ {
+ "id": "w0",
+ "text": "murals,",
+ "start": 0.06,
+ "end": 0.52
+ },
+ {
+ "id": "w1",
+ "text": "grass",
+ "start": 0.52,
+ "end": 0.87
+ },
+ {
+ "id": "w2",
+ "text": "cloths",
+ "start": 0.87,
+ "end": 1.24
+ },
+ {
+ "id": "w3",
+ "text": "and",
+ "start": 1.31,
+ "end": 1.47
+ },
+ {
+ "id": "w4",
+ "text": "statement",
+ "start": 1.47,
+ "end": 2.09
+ },
+ {
+ "id": "w5",
+ "text": "patterns,",
+ "start": 2.09,
+ "end": 2.76
+ },
+ {
+ "id": "w6",
+ "text": "the",
+ "start": 2.82,
+ "end": 2.88
+ },
+ {
+ "id": "w7",
+ "text": "season's",
+ "start": 2.88,
+ "end": 3.67
+ },
+ {
+ "id": "w8",
+ "text": "newest,",
+ "start": 3.67,
+ "end": 4.4
+ },
+ {
+ "id": "w9",
+ "text": "all",
+ "start": 4.4,
+ "end": 4.58
+ },
+ {
+ "id": "w10",
+ "text": "in",
+ "start": 4.58,
+ "end": 4.71
+ },
+ {
+ "id": "w11",
+ "text": "one",
+ "start": 4.71,
+ "end": 4.92
+ },
+ {
+ "id": "w12",
+ "text": "place.",
+ "start": 4.92,
+ "end": 5.44
+ }
+ ]
+ },
+ {
+ "frame": 8,
+ "path": "assets/voice/08.wav",
+ "duration_s": 3.499,
+ "words": [
+ {
+ "id": "w0",
+ "text": "Shop",
+ "start": 0.07,
+ "end": 0.3
+ },
+ {
+ "id": "w1",
+ "text": "new",
+ "start": 0.41,
+ "end": 0.54
+ },
+ {
+ "id": "w2",
+ "text": "arrivals",
+ "start": 0.54,
+ "end": 1.15
+ },
+ {
+ "id": "w3",
+ "text": "at",
+ "start": 1.15,
+ "end": 1.31
+ },
+ {
+ "id": "w4",
+ "text": "designerwallcoverings.com",
+ "start": 1.31,
+ "end": 3.26
+ }
+ ]
+ }
+ ],
+ "sfx": []
+}
\ No newline at end of file
diff --git a/videos/dw-new-arrivals-reveal/audio_request.json b/videos/dw-new-arrivals-reveal/audio_request.json
new file mode 100644
index 0000000..ebd1c93
--- /dev/null
+++ b/videos/dw-new-arrivals-reveal/audio_request.json
@@ -0,0 +1,44 @@
+{
+ "provider": "kokoro",
+ "speed": 1,
+ "lines": [
+ {
+ "id": "01",
+ "text": "The new season has arrived."
+ },
+ {
+ "id": "02",
+ "text": "Leading the collection: Floral Fantasy from Rebel Walls — a full-wall mural in soft pink, gray, and black."
+ },
+ {
+ "id": "03",
+ "text": "Venus, in graphic black — a bold botanical from Thibaut."
+ },
+ {
+ "id": "04",
+ "text": "Floral Chinoiserie in green, and Floral Elegance in gray — painterly murals from Rebel Walls."
+ },
+ {
+ "id": "05",
+ "text": "Maranta Arrowroot in pale green, and Daintree in bluemoon — layered botanicals from Thibaut."
+ },
+ {
+ "id": "06",
+ "text": "Serengeti in aqua, and the refined Gleniffer damask — texture and structure, both new from Thibaut."
+ },
+ {
+ "id": "07",
+ "text": "Murals, grasscloths, and statement patterns — the season's newest, all in one place."
+ },
+ {
+ "id": "08",
+ "text": "Shop new arrivals at designer wallcoverings dot com."
+ }
+ ],
+ "bgm": {
+ "mode": "retrieve",
+ "query": "elegant",
+ "blob": "New-season wallcovering arrivals have landed — shop the reveal",
+ "arc": "Hook → Hero reveal → Feature cascade → CTA"
+ }
+}
\ No newline at end of file
diff --git a/videos/dw-new-arrivals-reveal/capture/assets/daintree-bluemoon-thibaut.jpg b/videos/dw-new-arrivals-reveal/capture/assets/daintree-bluemoon-thibaut.jpg
new file mode 100644
index 0000000..653714e
Binary files /dev/null and b/videos/dw-new-arrivals-reveal/capture/assets/daintree-bluemoon-thibaut.jpg differ
diff --git a/videos/dw-new-arrivals-reveal/capture/assets/floral-chinoiserie-green.jpg b/videos/dw-new-arrivals-reveal/capture/assets/floral-chinoiserie-green.jpg
new file mode 100644
index 0000000..afb2556
Binary files /dev/null and b/videos/dw-new-arrivals-reveal/capture/assets/floral-chinoiserie-green.jpg differ
diff --git a/videos/dw-new-arrivals-reveal/capture/assets/floral-elegance-gray.jpg b/videos/dw-new-arrivals-reveal/capture/assets/floral-elegance-gray.jpg
new file mode 100644
index 0000000..da55ba0
Binary files /dev/null and b/videos/dw-new-arrivals-reveal/capture/assets/floral-elegance-gray.jpg differ
diff --git a/videos/dw-new-arrivals-reveal/capture/assets/floral-fantasy-soft-pink.jpg b/videos/dw-new-arrivals-reveal/capture/assets/floral-fantasy-soft-pink.jpg
new file mode 100644
index 0000000..9af88f2
Binary files /dev/null and b/videos/dw-new-arrivals-reveal/capture/assets/floral-fantasy-soft-pink.jpg differ
diff --git a/videos/dw-new-arrivals-reveal/capture/assets/gleniffer-black-and-grey.jpg b/videos/dw-new-arrivals-reveal/capture/assets/gleniffer-black-and-grey.jpg
new file mode 100644
index 0000000..cb2d5ac
Binary files /dev/null and b/videos/dw-new-arrivals-reveal/capture/assets/gleniffer-black-and-grey.jpg differ
diff --git a/videos/dw-new-arrivals-reveal/capture/assets/maranta-arrowroot-pale-green.jpg b/videos/dw-new-arrivals-reveal/capture/assets/maranta-arrowroot-pale-green.jpg
new file mode 100644
index 0000000..33285a2
Binary files /dev/null and b/videos/dw-new-arrivals-reveal/capture/assets/maranta-arrowroot-pale-green.jpg differ
diff --git a/videos/dw-new-arrivals-reveal/capture/assets/serengeti-aqua-thibaut.jpg b/videos/dw-new-arrivals-reveal/capture/assets/serengeti-aqua-thibaut.jpg
new file mode 100644
index 0000000..4e060cd
Binary files /dev/null and b/videos/dw-new-arrivals-reveal/capture/assets/serengeti-aqua-thibaut.jpg differ
diff --git a/videos/dw-new-arrivals-reveal/capture/assets/venus-black-thibaut.jpg b/videos/dw-new-arrivals-reveal/capture/assets/venus-black-thibaut.jpg
new file mode 100644
index 0000000..945752c
Binary files /dev/null and b/videos/dw-new-arrivals-reveal/capture/assets/venus-black-thibaut.jpg differ
diff --git a/videos/dw-new-arrivals-reveal/capture/extracted/asset-descriptions.md b/videos/dw-new-arrivals-reveal/capture/extracted/asset-descriptions.md
new file mode 100644
index 0000000..5deb512
--- /dev/null
+++ b/videos/dw-new-arrivals-reveal/capture/extracted/asset-descriptions.md
@@ -0,0 +1,23 @@
+# Asset inventory — Designer Wallcoverings New Arrivals
+
+Eight new-arrival product images were downloaded locally to `capture/assets/`
+from the DW New Arrivals collection (no-capture path — provided source, not
+crawled). All are true JPEG, verified with `file`. Selected for visual variety
+and impact.
+
+| File | Pattern / Vendor | Look | Dominant color | Dims | Role |
+|---|---|---|---|---|---|
+| `capture/assets/floral-fantasy-soft-pink.jpg` | Floral Fantasy / Rebel Walls | Full-wall romantic floral mural, blowsy blooms | Soft pink, gray, black | 1200x800 | **Hero** — statement pattern |
+| `capture/assets/venus-black-thibaut.jpg` | Venus / Thibaut | Graphic ink botanical, bold silhouettes | Black on cream | 1200x1200 | Cascade — high-contrast beat |
+| `capture/assets/floral-elegance-gray.jpg` | Floral Elegance / Rebel Walls | Soft editorial floral, painterly | Gray, blush | 1200x1376 | Cascade |
+| `capture/assets/floral-chinoiserie-green.jpg` | Floral Chinoiserie / Rebel Walls | Lush chinoiserie scenic, birds-and-branches | Green | 1200x1432 | Cascade |
+| `capture/assets/maranta-arrowroot-pale-green.jpg` | Maranta Arrowroot / Thibaut | Grasscloth-feel botanical, arrowroot leaves | Pale green | 1200x1200 | Cascade |
+| `capture/assets/daintree-bluemoon-thibaut.jpg` | Daintree / Thibaut | Layered leaf motif, tropical foliage | Cool blue (bluemoon) | 1200x1200 | Cascade |
+| `capture/assets/serengeti-aqua-thibaut.jpg` | Serengeti / Thibaut | Animal-print texture, tonal spots | Aqua | 1200x1200 | Cascade |
+| `capture/assets/gleniffer-black-and-grey.jpg` | Gleniffer / Thibaut | Refined damask, symmetrical | Black and grey | 1200x1200 | Cascade / close |
+
+Notes:
+- The three Rebel Walls files are room-setting interiors (mural on a styled wall);
+ the five Thibaut files are flat pattern swatches.
+- No brand logo asset captured; the DW wordmark is rendered as type from the
+ cartesian preset's display font.
diff --git a/videos/dw-new-arrivals-reveal/capture/extracted/tokens.json b/videos/dw-new-arrivals-reveal/capture/extracted/tokens.json
new file mode 100644
index 0000000..02491af
--- /dev/null
+++ b/videos/dw-new-arrivals-reveal/capture/extracted/tokens.json
@@ -0,0 +1,6 @@
+{
+ "title": "New Arrivals — Designer Wallcoverings",
+ "description": "New-season wallcovering arrivals from Designer Wallcoverings: a collection reveal of the season's newest patterns from Rebel Walls and Thibaut.",
+ "colors": ["#1c1a17", "#f4efe6", "#b98a7a", "#7c8c6f", "#2f3d4a"],
+ "fonts": ["Cormorant Garamond", "Inter"]
+}
diff --git a/videos/dw-new-arrivals-reveal/capture/extracted/visible-text.txt b/videos/dw-new-arrivals-reveal/capture/extracted/visible-text.txt
new file mode 100644
index 0000000..457a9eb
--- /dev/null
+++ b/videos/dw-new-arrivals-reveal/capture/extracted/visible-text.txt
@@ -0,0 +1,23 @@
+Designer Wallcoverings — New Arrivals — Collection Reveal
+
+The new season has landed. Designer Wallcoverings has just added its newest
+wallcovering arrivals — statement murals and refined patterns from the houses of
+Rebel Walls and Thibaut.
+
+Hero: Floral Fantasy, Soft Pink (Rebel Walls) — romantic pink, gray and black
+florals rendered as a full-wall mural.
+
+The new arrivals:
+- Floral Fantasy — Rebel Walls — soft pink, gray, black romantic florals ($191)
+- Venus, Black — Thibaut — graphic ink-on-cream botanical
+- Floral Elegance, Gray — Rebel Walls — soft editorial floral ($191)
+- Floral Chinoiserie, Green — Rebel Walls — lush chinoiserie scenic ($191)
+- Maranta Arrowroot, Pale Green — Thibaut — grasscloth-feel botanical
+- Daintree, Bluemoon — Thibaut — layered leaf motif in cool blue
+- Serengeti, Aqua — Thibaut — animal-print texture in aqua
+- Gleniffer, Black and Grey — Thibaut — refined monochrome damask
+
+Closing call to action: Shop New Arrivals at designerwallcoverings.com
+
+Brand voice: luxury, editorial, to-the-trade and retail. Never the word
+"Wallpaper" — always "Wallcovering" / "Wallcoverings".
diff --git a/videos/dw-new-arrivals-reveal/frame.md b/videos/dw-new-arrivals-reveal/frame.md
new file mode 100644
index 0000000..0cf596d
--- /dev/null
+++ b/videos/dw-new-arrivals-reveal/frame.md
@@ -0,0 +1,286 @@
+---
+version: alpha
+name: Cartesian — Frame (video / frame layer)
+description: >
+ Video-first companion to Cartesian's design.md. The unit is the frame (1920×1080). Atoms are
+ identical and sacred — the five-tone warm-stone palette, Cormorant Garamond 400 + Cormorant Garamond, the
+ universal 1px taupe hairline as the only structural device, compass-drafted geometric rings,
+ and zero shadow / zero fill. Composition, frame scale, and aspect-ratio behavior are rewritten
+ for the frame. Restraint is the rule; motion is out of scope.
+unit: the frame — 1920×1080 primary; 9:16 and 1:1 documented
+principle: atoms are sacred · composition is free · numbers come from the script
+
+colors:
+ bg-primary: "#f4efe6"
+ bg-secondary: "#E5D4CE"
+ text-primary: "#1c1a17"
+ text-secondary: "#5A5A5A"
+ accent: "#7c8c6f"
+ line: "#b98a7a"
+ white-overlay: "rgba(255,255,255,0.3)"
+
+typography:
+ # — reading ramp (Cormorant Garamond) —
+ body: { fontFamily: "Cormorant Garamond", cqw: 1.0, weight: 400, lineHeight: 1.6, color: "text-secondary" }
+ body-sm: { fontFamily: "Cormorant Garamond", cqw: 0.85, weight: 400, lineHeight: 1.6 }
+ subtitle: { fontFamily: "Cormorant Garamond", cqw: 1.3, weight: 400, lineHeight: 1.5 }
+ label: { fontFamily: "Cormorant Garamond", px: 14, weight: 500, tracking: "3px", upper: true, color: "accent" }
+ attribution: { fontFamily: "Cormorant Garamond", px: 15, weight: 400, tracking: "2px", upper: true, color: "accent" }
+ micro: { fontFamily: "Cormorant Garamond", px: 12, weight: 400, tracking: "2px", upper: true, color: "accent" }
+ # — display / hero ramp (Cormorant Garamond 400, sentence case) —
+ h3: { fontFamily: "Cormorant Garamond", cqw: 1.8, weight: 400, lineHeight: 1.1 }
+ timeline-headline:{ fontFamily: "Cormorant Garamond", cqw: 1.9, weight: 400, lineHeight: 1.1 }
+ card-headline:{ fontFamily: "Cormorant Garamond", cqw: 2.0, weight: 400, lineHeight: 1.15 }
+ stat-figure: { fontFamily: "Cormorant Garamond", cqw: 3.0, weight: 400, lineHeight: 1.0 }
+ quote-mark: { fontFamily: "Cormorant Garamond", cqw: 9.0, weight: 400, lineHeight: 0.5, color: "line" }
+ h2: { fontFamily: "Cormorant Garamond", cqw: 4.0, weight: 400, lineHeight: 1.1 }
+ h1: { fontFamily: "Cormorant Garamond", cqw: 6.2, weight: 400, lineHeight: 1.06 }
+ display: { fontFamily: "Cormorant Garamond", cqw: 8.0, weight: 400, lineHeight: 1.04 }
+
+spacing:
+ pad-x: "7cqw"
+ pad-y: "5cqw"
+ gap-xl: "6cqw"
+ gap-lg: "5cqw"
+
+components:
+ hairline:
+ rule: "0.07cqw solid {colors.line}"
+ description: "The universal structural device — every separator (agenda rule, timeline connector, card border, stats top) is this 1px taupe line. No thick borders exist."
+ card:
+ backgroundColor: "{colors.white-overlay}"
+ border: "0.07cqw solid {colors.line}"
+ rounded: "0"
+ shadow: "none"
+ description: "Faint white-overlay fill (canvas bleeds through) is what makes a card distinct from a bare region."
+ card-icon:
+ border: "0.07cqw solid {colors.line}"
+ rounded: "50%"
+ size: "40px circle"
+ textColor: "{colors.accent}"
+ typography: "Playfair numeral/letter"
+ description: "Ringed circle mark."
+ agenda-row:
+ borderBottom: "0.07cqw solid {colors.line}"
+ typography: "{typography.h3} (numeral {colors.accent}, label {colors.text-primary})"
+ description: "Numeral left, label right over a taupe rule."
+ timeline:
+ borderTop: "0.07cqw solid {colors.line}"
+ typography: "{typography.timeline-headline} + {typography.body-sm}"
+ description: "A single taupe top rule across items — no nodes, no dots."
+ stats-cluster:
+ borderTop: "0.07cqw solid {colors.line}"
+ typography: "{typography.stat-figure} + uppercase {colors.accent} labels"
+ description: "Inline modest stat figures (no hero numeral)."
+ geo-ring:
+ border: "1px solid {colors.line} (inner dashed ::before ~70–80%)"
+ rounded: "50%"
+ size: "10–50cqw"
+ opacity: "0.2–0.5"
+ description: "Compass-construction rings behind content. 1–2 per frame, never more."
+ horizontal-accent:
+ backgroundColor: "{colors.text-primary}"
+ size: "~18cqw × 1px"
+ description: "The system's only INK-BLACK rule — a strong terminal accent on cover/closing, sparingly."
+ vertical-line:
+ backgroundColor: "{colors.line}"
+ size: "1px × full height, ~5cqw from edge"
+ opacity: "0.3–0.4"
+ description: "Drafting-paper alignment guide. Optional."
+ image-placeholder:
+ backgroundColor: "{colors.bg-secondary}"
+ mark: "crossed +30°/−30° 1px taupe diagonals (an X)"
+ typography: "small uppercase {typography.micro}"
+ description: "The signature image-not-wired mark."
+ team-photo:
+ backgroundColor: "{colors.bg-secondary}"
+ border: "0.07cqw solid {colors.line}"
+ rounded: "50%"
+ typography: "Playfair initial in {colors.accent}"
+ description: "Circular portrait frame."
+---
+
+# Cartesian — Frame (video / frame layer)
+
+## Brand adaptation (READ FIRST — the frontmatter is the source of truth)
+
+This is the **cartesian** preset remixed onto the captured brand. The YAML frontmatter above (colors · typography · components) is **normative and already correct — use it verbatim.** The prose below is the ORIGINAL preset's intent; read it THROUGH the frontmatter:
+
+- **Fonts** — already set to **Cormorant Garamond** (display) / **Inter** (body); ignore any preset font name lingering in prose.
+- **Colors** — use the frontmatter hex; preset color NAMES in prose (e.g. "cobalt", "cream") mean the remapped brand values.
+
+
+## Overview
+
+Cartesian at frame scale is a **quiet museum-catalog editorial system** — restraint through 1px
+lines. Every structural separator is a single 1px taupe hairline; there are no thick borders, no
+fills (save the faint white-overlay card), no shadows, no rounded rectangles. Hierarchy comes from
+**type contrast and negative space**, and atmosphere from **compass-drafted geometric rings**
+drifting behind content.
+
+The voice is a literary pairing: **Cormorant Garamond** at weight 400 (the thin-stroke didone, never
+bold, always sentence case) carries every headline, numeral, and quote mark in ink; **Cormorant Garamond**
+carries body in warm gray and labels in uppercase taupe with 2–3px tracking. The palette is five
+warm stones plus ink — no populist accent color exists. The correct density is **sparse and
+breathing**: one clear idea, well-framed, on stone paper.
+
+**Key characteristics at frame scale:**
+
+- **1px taupe hairline** as the universal structural device — every separator is this one line.
+- **Cormorant Garamond 400** (ink, sentence case) for display; **Cormorant Garamond** body (gray) + labels (taupe, tracked).
+- **Five warm stones + ink** — no red/blue/green; the only "color" is type contrast.
+- **Compass-drafted geometric rings** (solid + dashed, 20–50% opacity) behind content for mood.
+- **Flat** — zero shadow, zero rounded rectangle (circles only); the lone ink line is the `horizontal-accent`.
+- **Sparse and breathing** — generous negative space; crowding reads as broken.
+
+## The Frame
+
+### Frame Craft Bar
+
+Three eyeball tests gate every frame before any structural check:
+
+- **Squint** — one Playfair element dominates at **3–6× its nearest neighbor**; the serif/sans + size contrast carries hierarchy, not weight.
+- **Silence** — declarative frames read **55–60% empty**; Cartesian has **no dense frame** — even the agenda/index breathes (the system breaks when crowded).
+- **Restraint** — **at most two geo rings** per frame; the single INK-BLACK `horizontal-accent` rule used sparingly; no populist accent color ever.
+- **Reference** — aim at a **Vignelli editorial / Cooper Hewitt catalogue / pencil-and-tracing-paper plan**; failure looks like a **shadowed, rounded-card SaaS deck**.
+
+- **Primary:** 1920×1080 (16:9). Display authored in **`cqw`** (`px ÷ 1920 × 100 = cqw`).
+- **Vertical:** 1080×1920 (9:16). **Square:** 1080×1080 (1:1).
+- **Safe area:** `pad-x` (7cqw) generous gutters; geometry may bleed off an edge.
+
+**The container law (load-bearing).** Every frame ground sets `container-type: size`; ALL
+frame-relative units are `cqw`/`cqh` against it — never `vw`. The 1px hairlines and geo rings hold
+their proportion against the frame at any render size.
+
+## Colors
+
+Tokens identical to the source. `{colors.bg-primary}` is the ground; `{colors.text-primary}` ink is
+headlines and the one black accent rule; `{colors.text-secondary}` gray is body; `{colors.accent}`
+taupe is labels, numerals, small text; `{colors.line}` taupe is every 1px structural border.
+`{colors.bg-secondary}` is the only secondary fill (placeholders, photo frames). **No populist
+accent** — when emphasis is needed, grow the type, switch sans→serif, or add a single
+`horizontal-accent` ink line. Headlines are never taupe; small text is never ink.
+
+## Typography
+
+Two ramps. The **reading ramp** (Cormorant Garamond body 1.0cqw gray, labels in px taupe) carries copy + chrome;
+the **display ramp** (Playfair `h3` 1.8cqw → `display` 8.0cqw, all weight 400) carries every headline.
+
+- **Legibility floor:** any load-bearing line ≥ **1.4cqw**; px labels are chrome only.
+- **Fit-to-measure:** size the headline to its length. Cap the block at **≤ 78cqw**; ≤3 words → `display`/`h1`; 4–6 → `h2`; 7+ → `h3`. Cartesian has no hero-stat numeral — stats stay modest (`stat-figure` 3cqw).
+- **Playfair at 400, ink, sentence case** — never bold, never uppercase, never taupe. **Cormorant Garamond labels uppercase, 2–3px tracked, taupe.** Italic via Playfair italic for emphasis only.
+
+## Depth & Surface
+
+The flat plane is the only technique. Hierarchy from:
+
+- **Type contrast** — Playfair serif vs Cormorant Garamond sans; the 8cqw→0.7cqw scale.
+- **1px taupe hairlines** — every divider, card outline, timeline rule, photo ring.
+- **Tone** — ink vs gray vs taupe.
+- **Negative space** — generous padding.
+- **Geometric atmosphere** — compass rings that suggest depth without creating it.
+
+**Ceiling:** no box-shadow, no elevated card, no gradient, no rounded rectangle. The single ink line
+(`horizontal-accent`) is the only non-taupe rule.
+
+## Shapes
+
+- **50% (circle)** — card-icon, team-photo, nav-dot, every geo ring.
+- **0** — everything else; soft-rounded corners do not exist.
+
+## Components
+
+- **hairline** — the universal 1px taupe separator (the identity).
+- **card** (1px taupe + white-overlay) / **card-icon** (ringed circle) / **agenda-row** / **timeline** (line, no nodes) / **stats-cluster** — all built on the hairline.
+- **geo-ring** — compass decoration (solid + dashed), 1–2 per frame. **horizontal-accent** — the one ink line, sparingly. **vertical-line** — drafting guide.
+- **image-placeholder** (crossed-X) / **team-photo** (ringed initial) — the stone-fill placeholders.
+
+## Frame Treatments
+
+> Recipe: ground · container · composes · focal · chrome · accent · silence · Fixed/Free · density.
+> Every frame is sparse and breathing; 1–2 geo decorations max.
+
+### 1 · Cover (identity · move: serif + compass ring · left)
+
+**Ground** `{colors.bg-primary}`, `pad-x`. **Composes** geo-ring (right, ~34cqw, solid+dashed), vertical-line (left), label, display/h1. **Focal** a 2–3 line Playfair `display`/`h1` headline in ink (italic on the key word), left-anchored, with a taupe `label` above and an Cormorant Garamond subtitle below. **Chrome** optional bottom meta row (Playfair value + taupe label). **Accent** the geo ring; optionally one `horizontal-accent` ink line (if it clears the meta). **Silence** ~55% empty. **Fixed** Playfair 400 ink sentence-case, ≤2 geo elements, 1px lines. **Free** title, ring placement, meta. **Density** sparse.
+
+### 2 · Agenda / Index (index · move: hairline list · left)
+
+**Ground** `{colors.bg-primary}`, `pad-x`. **Composes** label, h2, agenda-rows. **Focal** a Playfair `h2` over 4–6 agenda rows (Playfair numeral in taupe + Playfair label in ink), each on a 1px taupe rule. **Chrome** taupe `label` eyebrow. **Accent** none — taupe numerals carry it. **Silence** moderate; rows generously spaced. **Fixed** 1px taupe rules, Playfair 400. **Free** items, count. **Density** standard (sparse rows).
+
+### 3 · Pull Quote (quote · move: centered statement · compass ring)
+
+**Ground** `{colors.bg-primary}`, centered. **Composes** geo-ring (centered dashed, ~26cqw), quote-mark, h2/display-quote, attribution. **Focal** a 2-line Playfair quote in ink, centered, under a 50%-taupe Playfair quote-mark; a taupe uppercase attribution beneath. **Accent** the faint centered ring. **Silence** ~60% — deliberately open. **Fixed** Playfair 400, one ring, centered. **Free** quote, attribution. **Density** sparse.
+
+### 4 · Closing Plate (closer · move: centered ring · centered)
+
+**Ground** `{colors.bg-primary}`, centered. **Composes** geo-ring (centered, ~40cqw, solid+dashed), label, h1/display, horizontal-accent. **Focal** a 1–2 line Playfair sign-off in ink (italic key word), centered inside the largest compass ring; a short ink `horizontal-accent` beneath. **Accent** the ring + the one ink line. **Silence** ~60%. **Fixed** Playfair 400, centered, ≤2 geo. **Free** sign-off, ring scale. **Density** sparse.
+
+### 5 · Two-Column Editorial (content · move: asymmetric split · left)
+
+**Ground** `{colors.bg-primary}`, `pad-x`, two columns with `gap-xl`. **Composes** label, h2, body, image-placeholder (crossed-X) or card. **Focal** a Playfair `h2` + Cormorant Garamond body in the text column; an image-placeholder or card in the other. **Accent** none. **Silence** generous gutter. **Fixed** 1px taupe card/placeholder borders, white-overlay fill. **Free** which side is text, body copy. **Density** standard.
+
+### 6 · Stats / Timeline (data · move: hairline rail · left)
+
+**Ground** `{colors.bg-primary}`, `pad-x`. **Composes** label, h3, stats-cluster or timeline. **Focal** a modest Playfair stat row (or a 1px-rule timeline with year + headline + body, no nodes), framed by a 1px taupe top rule. **Accent** none. **Silence** moderate. **Fixed** modest stat scale, hairline rule, no nodes. **Free** figures, phases. **Density** standard.
+
+## Composition Rules
+
+### Do
+
+- Use a **single 1px taupe line** for every separator — the hairline is the identity.
+- Set every **Playfair headline at 400, ink, sentence case**; render labels taupe, uppercase, 2–3px tracked.
+- Layer **one or two compass rings** (solid + dashed, 20–50% opacity) behind content for atmosphere.
+- Let frames **breathe** — sparse, generous negative space; 55–60% empty on declarative frames.
+- Lean centered on quote/closer; asymmetric/left on cover/agenda/editorial. Use `bg-secondary` for placeholder fills.
+
+### Don't
+
+- Don't introduce a populist accent color — stone and ink only.
+- Don't bold Playfair, render headlines in taupe, or use thick (2px+) borders.
+- Don't add shadows, elevated cards, or rounded rectangles (circles only).
+- Don't crowd the frame — packed layouts read as broken.
+- Never more than two geo decorations per frame; don't blow a headline edge-to-edge.
+
+## Aspect-Ratio Behavior
+
+| Treatment | 16:9 | 9:16 | 1:1 |
+| -------------------- | -------------------------- | ----------------------------------- | --------------------------- |
+| Cover | headline left, ring right | headline top, ring below | headline upper, ring behind |
+| Agenda / Index | h2 + rows | h2 + rows (tighter) | h2 + rows |
+| Pull Quote | centered, ring behind | centered, taller | centered |
+| Closing Plate | centered in ring | centered, ring scaled | centered |
+| Two-Column Editorial | text + visual side-by-side | stacked (collapse) | stacked |
+| Stats / Timeline | horizontal rail | vertical stack (drop timeline rule) | compact |
+
+Generous `pad-x` holds on the short edge; re-step display per ratio above the 1.4cqw floor. On
+9:16, the timeline rule loses meaning when stacked — switch to a vertical list (per source).
+
+## Approved Entities
+
+No real customers, logos, or vendors are defined in the source — render any such mark as a
+placeholder (the crossed-X image-placeholder, or a ringed initial for portraits).
+
+## Numerals & Claims (hard rule)
+
+Never invent figures, dates, or counts at frame scale. Render slots as `— figure —`, `{metric}`.
+Stats and timeline years carry placeholders until the script supplies them. Agenda ordinals
+(01, 02…) are decorative and may be sequential.
+
+## Pre-Render Self-Audit
+
+- **Squint** — one Playfair element dominates; the serif/sans contrast carries hierarchy.
+- **Silence** — declarative frames 55–60% empty; nothing is crowded.
+- **Palette** — five stones + ink only; no populist accent; headlines ink, labels taupe.
+- **Lines** — every separator is a 1px taupe hairline; the only ink line is `horizontal-accent`.
+- **Type** — Playfair 400 sentence-case, fit-to-measure; labels uppercase 2–3px; ≥1.4cqw floor.
+- **Depth** — 0 shadow, 0 rounded rectangle; ≤2 geo rings per frame.
+- **Anchor** — centered on quote/closer, left/asymmetric on cover/agenda/editorial; no 3 in a row alike.
+- **Fabrication** — every numeral traces to the script, else placeholder.
+
+## Known Gaps
+
+- **Motion intentionally out of scope.** frame.md specifies composition only; the 0.6s fade in the source is a deck mechanic.
+- **Cormorant Garamond + Cormorant Garamond via Google Fonts.** CJK pairing (Noto Serif SC 700/400) carries over; Playfair has no Hanzi italic — substitute weight/taupe for emphasis.
+- **9:16 / 1:1 are guidance**; verify the legibility floor and that the timeline collapses to a vertical list.
+- Geo rings, the crossed-X placeholder, and the dashed inner ring are CSS-only; no external imagery is required.
diff --git a/videos/dw-new-arrivals-reveal/hyperframes.json b/videos/dw-new-arrivals-reveal/hyperframes.json
new file mode 100644
index 0000000..dc9ec2e
--- /dev/null
+++ b/videos/dw-new-arrivals-reveal/hyperframes.json
@@ -0,0 +1,12 @@
+{
+ "$schema": "https://hyperframes.heygen.com/schema/hyperframes.json",
+ "registry": "https://raw.githubusercontent.com/heygen-com/hyperframes/main/registry",
+ "paths": {
+ "blocks": "compositions",
+ "components": "compositions/components",
+ "assets": "assets"
+ },
+ "media": {
+ "autoProxy": true
+ }
+}
diff --git a/videos/dw-new-arrivals-reveal/index.html b/videos/dw-new-arrivals-reveal/index.html
new file mode 100644
index 0000000..cfed975
--- /dev/null
+++ b/videos/dw-new-arrivals-reveal/index.html
@@ -0,0 +1,59 @@
+<!doctype html>
+<html lang="en">
+ <head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=1920, height=1080" />
+ <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
+ <style>
+ * {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+ }
+ html,
+ body {
+ margin: 0;
+ width: 1920px;
+ height: 1080px;
+ overflow: hidden;
+ background: #000;
+ }
+ body {
+ font-family: "Inter", sans-serif;
+ }
+ code,
+ pre,
+ .monospace {
+ font-family: "JetBrains Mono", monospace;
+ }
+ </style>
+ </head>
+ <body>
+ <div
+ id="root"
+ data-composition-id="main"
+ data-start="0"
+ data-duration="10"
+ data-width="1920"
+ data-height="1080"
+ >
+
+
+
+ <!--
+ Add your clips here. Example:
+ <div id="title" class="clip" data-start="0" data-duration="5" data-track-index="1"
+ style="font-size: 64px; color: #fff; padding: 40px">
+ Hello World
+ </div>
+ -->
+ </div>
+
+ <script>
+ window.__timelines = window.__timelines || {};
+ const tl = gsap.timeline({ paused: true });
+ // Example: tl.from("#title", { opacity: 0, y: -50, duration: 1 }, 0);
+ window.__timelines["main"] = tl;
+ </script>
+ </body>
+</html>
diff --git a/videos/dw-new-arrivals-reveal/meta.json b/videos/dw-new-arrivals-reveal/meta.json
new file mode 100644
index 0000000..710cb9a
--- /dev/null
+++ b/videos/dw-new-arrivals-reveal/meta.json
@@ -0,0 +1,5 @@
+{
+ "id": "dw-new-arrivals-reveal",
+ "name": "dw-new-arrivals-reveal",
+ "createdAt": "2026-07-17T14:50:51.442Z"
+}
\ No newline at end of file
diff --git a/videos/dw-new-arrivals-reveal/package.json b/videos/dw-new-arrivals-reveal/package.json
new file mode 100644
index 0000000..791cae4
--- /dev/null
+++ b/videos/dw-new-arrivals-reveal/package.json
@@ -0,0 +1,11 @@
+{
+ "name": "dw-new-arrivals-reveal",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "dev": "npx --yes hyperframes@0.7.61 preview",
+ "check": "npx --yes hyperframes@0.7.61 check",
+ "render": "npx --yes hyperframes@0.7.61 render",
+ "publish": "npx --yes hyperframes@0.7.61 publish"
+ }
+}
← 1d2a1cb console: Video Studio — buttons to queue IG reel / URL→reel
·
back to Dw Marketing Reels
·
video-studio hardening (contrarian FIX-FIRST): realpathSync d648cd2 →