[object Object]

← back to Dw Marketing Reels

auto-save: 2026-07-22T07:12:00 (3 files) — data/new-arrivals.json data/reels.json scripts/video-runner.mjs

c0278ded55420b94901c0190f44f4949c74f3f9f · 2026-07-22 07:12:15 -0700 · Steve Abrams

Files touched

Diff

commit c0278ded55420b94901c0190f44f4949c74f3f9f
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed Jul 22 07:12:15 2026 -0700

    auto-save: 2026-07-22T07:12:00 (3 files) — data/new-arrivals.json data/reels.json scripts/video-runner.mjs
---
 data/new-arrivals.json   | 152 +++++++++++++++++++++++------------------------
 data/reels.json          |  40 +++++++++++++
 scripts/video-runner.mjs |  49 ++++++++++++---
 3 files changed, 157 insertions(+), 84 deletions(-)

diff --git a/data/new-arrivals.json b/data/new-arrivals.json
index 16ccc8e..2849080 100644
--- a/data/new-arrivals.json
+++ b/data/new-arrivals.json
@@ -1,8 +1,83 @@
 {
   "source": "https://designerwallcoverings.com/collections/new-arrivals",
-  "fetched_at": "2026-07-21T14:10:05.721Z",
+  "fetched_at": "2026-07-22T14:10:06.011Z",
   "count": 24,
   "items": [
+    {
+      "id": 7895904583731,
+      "handle": "flower-fall-pearl-wallcoverings-dwrw-361341",
+      "title": "Flower Fall, Pearl Wallcoverings | Rebel Walls",
+      "pattern": "Flower Fall",
+      "color": "Pearl",
+      "vendor": "Rebel Walls",
+      "product_type": "Mural",
+      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R19251_interior1.jpg?v=1784706015",
+      "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R19251_interior1_1200x.jpg?v=1784706015",
+      "price": "191.00",
+      "url": "https://designerwallcoverings.com/products/flower-fall-pearl-wallcoverings-dwrw-361341",
+      "created_at": "2026-07-22T00:40:09-07:00",
+      "published_at": "2026-07-22T01:25:47-07:00"
+    },
+    {
+      "id": 7895904550963,
+      "handle": "flower-art-pastel-wallcoverings-dwrw-361338",
+      "title": "Flower Art, Pastel Wallcoverings | Rebel Walls",
+      "pattern": "Flower Art",
+      "color": "Pastel",
+      "vendor": "Rebel Walls",
+      "product_type": "Mural",
+      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R20396_interior1.jpg?v=1784706011",
+      "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R20396_interior1_1200x.jpg?v=1784706011",
+      "price": "191.00",
+      "url": "https://designerwallcoverings.com/products/flower-art-pastel-wallcoverings-dwrw-361338",
+      "created_at": "2026-07-22T00:40:08-07:00",
+      "published_at": "2026-07-22T01:25:40-07:00"
+    },
+    {
+      "id": 7895904518195,
+      "handle": "flower-art-green-wallcoverings-dwrw-361337",
+      "title": "Flower Art, Green Wallcoverings | Rebel Walls",
+      "pattern": "Flower Art",
+      "color": "Green",
+      "vendor": "Rebel Walls",
+      "product_type": "Mural",
+      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R20397_interior1.webp?v=1784706010",
+      "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R20397_interior1_1200x.webp?v=1784706010",
+      "price": "191.00",
+      "url": "https://designerwallcoverings.com/products/flower-art-green-wallcoverings-dwrw-361337",
+      "created_at": "2026-07-22T00:40:06-07:00",
+      "published_at": "2026-07-22T01:25:32-07:00"
+    },
+    {
+      "id": 7895904485427,
+      "handle": "flower-art-blue-wallcoverings-dwrw-361336",
+      "title": "Flower Art, Blue Wallcoverings | Rebel Walls",
+      "pattern": "Flower Art",
+      "color": "Blue",
+      "vendor": "Rebel Walls",
+      "product_type": "Mural",
+      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R20395_interior1.webp?v=1784706008",
+      "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R20395_interior1_1200x.webp?v=1784706008",
+      "price": "191.00",
+      "url": "https://designerwallcoverings.com/products/flower-art-blue-wallcoverings-dwrw-361336",
+      "created_at": "2026-07-22T00:40:05-07:00",
+      "published_at": "2026-07-22T01:25:21-07:00"
+    },
+    {
+      "id": 7895904452659,
+      "handle": "flow-mini-shallow-grey-wallcoverings-dwrw-361334",
+      "title": "Flow Mini Shallow Grey Wallcoverings | Rebel Walls",
+      "pattern": "Flow Mini Shallow Grey",
+      "color": "",
+      "vendor": "Rebel Walls",
+      "product_type": "Mural",
+      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R18524_interior1.webp?v=1784706007",
+      "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R18524_interior1_1200x.webp?v=1784706007",
+      "price": "375.00",
+      "url": "https://designerwallcoverings.com/products/flow-mini-shallow-grey-wallcoverings-dwrw-361334",
+      "created_at": "2026-07-22T00:40:04-07:00",
+      "published_at": "2026-07-22T01:25:12-07:00"
+    },
     {
       "id": 7894970695731,
       "handle": "flow-mini-deep-blue-wallcoverings-dwrw-361333",
@@ -287,81 +362,6 @@
       "url": "https://designerwallcoverings.com/products/floral-garden-summer-wallcoverings-dwrw-361317",
       "created_at": "2026-07-19T00:40:10-07:00",
       "published_at": "2026-07-19T00:40:11-07:00"
-    },
-    {
-      "id": 7890539544627,
-      "handle": "floral-garden-red-wallcoverings-dwrw-361316",
-      "title": "Floral Garden, Red Wallcoverings | Rebel Walls",
-      "pattern": "Floral Garden",
-      "color": "Red",
-      "vendor": "Rebel Walls",
-      "product_type": "Mural",
-      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R18923_interior1.jpg?v=1784446811",
-      "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R18923_interior1_1200x.jpg?v=1784446811",
-      "price": "191.00",
-      "url": "https://designerwallcoverings.com/products/floral-garden-red-wallcoverings-dwrw-361316",
-      "created_at": "2026-07-19T00:40:07-07:00",
-      "published_at": "2026-07-19T00:40:08-07:00"
-    },
-    {
-      "id": 7890539511859,
-      "handle": "floral-garden-pink-wallcoverings-dwrw-361315",
-      "title": "Floral Garden, Pink Wallcoverings | Rebel Walls",
-      "pattern": "Floral Garden",
-      "color": "Pink",
-      "vendor": "Rebel Walls",
-      "product_type": "Mural",
-      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R18924_interior1.webp?v=1784446807",
-      "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/R18924_interior1_1200x.webp?v=1784446807",
-      "price": "191.00",
-      "url": "https://designerwallcoverings.com/products/floral-garden-pink-wallcoverings-dwrw-361315",
-      "created_at": "2026-07-19T00:40:04-07:00",
-      "published_at": "2026-07-19T00:40:05-07:00"
-    },
-    {
-      "id": 7888771252275,
-      "handle": "inverness-wide-width-grey-dwtt-74387",
-      "title": "Inverness Wide Width, Grey Wallcoverings | Thibaut",
-      "pattern": "Inverness Wide Width",
-      "color": "Grey",
-      "vendor": "Thibaut",
-      "product_type": "Wallcovering",
-      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/TWW10980_41e89dfd-4fc3-4294-975d-e791b6dbe22a.jpg?v=1784392814",
-      "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/TWW10980_41e89dfd-4fc3-4294-975d-e791b6dbe22a_1200x.jpg?v=1784392814",
-      "price": "58.64",
-      "url": "https://designerwallcoverings.com/products/inverness-wide-width-grey-dwtt-74387",
-      "created_at": "2026-07-18T09:40:11-07:00",
-      "published_at": "2026-07-18T09:40:12-07:00"
-    },
-    {
-      "id": 7888771219507,
-      "handle": "inverness-wide-width-fog-dwtt-74386",
-      "title": "Inverness Wide Width, Fog Wallcoverings | Thibaut",
-      "pattern": "Inverness Wide Width",
-      "color": "Fog",
-      "vendor": "Thibaut",
-      "product_type": "Wallcovering",
-      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/TWW10977_d4be4b87-a1b7-4d0f-ae35-e55a62e79c1b.jpg?v=1784392811",
-      "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/TWW10977_d4be4b87-a1b7-4d0f-ae35-e55a62e79c1b_1200x.jpg?v=1784392811",
-      "price": "58.64",
-      "url": "https://designerwallcoverings.com/products/inverness-wide-width-fog-dwtt-74386",
-      "created_at": "2026-07-18T09:40:07-07:00",
-      "published_at": "2026-07-18T09:40:09-07:00"
-    },
-    {
-      "id": 7888770924595,
-      "handle": "geode-wide-width-denim-dwtt-74385",
-      "title": "Geode Wide Width, Denim Wallcoverings | Thibaut",
-      "pattern": "Geode Wide Width",
-      "color": "Denim",
-      "vendor": "Thibaut",
-      "product_type": "Wallcovering",
-      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/TWW10973.jpg?v=1784392805",
-      "image_hi": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/TWW10973_1200x.jpg?v=1784392805",
-      "price": "58.64",
-      "url": "https://designerwallcoverings.com/products/geode-wide-width-denim-dwtt-74385",
-      "created_at": "2026-07-18T09:40:03-07:00",
-      "published_at": "2026-07-18T09:40:05-07:00"
     }
   ]
 }
\ No newline at end of file
diff --git a/data/reels.json b/data/reels.json
index 01e1d62..bf85bf6 100644
--- a/data/reels.json
+++ b/data/reels.json
@@ -1,4 +1,44 @@
 [
+  {
+    "file": "new-arrivals-2026-07-22-14-10.mp4",
+    "created_at": "2026-07-22T14:10:32.853Z",
+    "products": 6,
+    "seconds": 19,
+    "titles": [
+      "Flower Fall / Pearl",
+      "Flower Art / Pastel",
+      "Flower Art / Green",
+      "Flower Art / Blue",
+      "Flow Mini Shallow Grey / ",
+      "Flow Mini Deep Blue / "
+    ],
+    "caption": "New arrivals just landed ✨ Flower Fall, Flower Art, Flow Mini Shallow Grey & more from Rebel Walls. Discover the latest wallcoverings — shop the collection at designerwallcoverings.com 🔗\n\n#DesignerWallcoverings #NewArrivals #Wallcovering #Wallcoverings #InteriorDesign #InteriorDecor #HomeDesign #LuxuryInteriors #DesignInspo #RebelWalls",
+    "hashtags": [
+      "#DesignerWallcoverings",
+      "#NewArrivals",
+      "#Wallcovering",
+      "#Wallcoverings",
+      "#InteriorDesign",
+      "#InteriorDecor",
+      "#HomeDesign",
+      "#LuxuryInteriors",
+      "#DesignInspo",
+      "#RebelWalls"
+    ],
+    "publish": {
+      "instagram": {
+        "status": "pending-creds",
+        "account": "dw",
+        "note": "Designer Wallcoverings @designerwallcoverings: IG_AGENT_AUTH not set (route via secrets skill)",
+        "at": "2026-07-22T14:10:32.896Z"
+      },
+      "tiktok": {
+        "status": "pending-reconnect",
+        "note": "TikTok channel not connected",
+        "at": "2026-07-22T14:10:32.896Z"
+      }
+    }
+  },
   {
     "file": "new-arrivals-2026-07-21-14-10.mp4",
     "created_at": "2026-07-21T14:10:32.095Z",
diff --git a/scripts/video-runner.mjs b/scripts/video-runner.mjs
index 6ffda24..8d5ab6b 100644
--- a/scripts/video-runner.mjs
+++ b/scripts/video-runner.mjs
@@ -19,6 +19,24 @@ import { dirname, join } from 'node:path';
 const ROOT = dirname(dirname(fileURLToPath(import.meta.url)));
 const JOBS = join(ROOT, 'data', 'video-jobs.json');
 const ARMED = process.env.VIDEO_AUTORUN === '1';
+// A single transient Anthropic API blip ("Server is temporarily limiting requests",
+// overloaded, 429/529) used to permanently kill a render. Retry those with backoff.
+const MAX_TRIES = Math.max(1, Number(process.env.VIDEO_MAX_TRIES || 3));
+const BACKOFF_MS = Math.max(1000, Number(process.env.VIDEO_BACKOFF_MS || 20000));
+const sleep = ms => new Promise(r => setTimeout(r, ms));
+const isTransient = s => /rate limit|temporarily limiting|overloaded|Overloaded|\b429\b|\b529\b|ECONNRESET|ETIMEDOUT|socket hang up/i.test(s || '');
+
+// Run one `claude -p` render, capturing stderr (still echoed to the parent) so we can
+// classify failures. Resolves { ok, code, err }.
+function runClaude(CLAUDE_BIN, pr) {
+  return new Promise(resolve => {
+    let err = '';
+    const ch = spawn(CLAUDE_BIN, ['-p', pr], { cwd: ROOT, stdio: ['ignore', 'inherit', 'pipe'] });
+    ch.stderr.on('data', d => { err += d; process.stderr.write(d); });
+    ch.on('close', code => resolve({ ok: code === 0, code, err }));
+    ch.on('error', e => resolve({ ok: false, code: -1, err: String(e.message) }));
+  });
+}
 
 const prompt = (j) => {
   const fmt = j.format === '1:1' ? '1:1 (1080×1080)' : '9:16 Instagram Reels (1080×1920)';
@@ -50,14 +68,29 @@ const prompt = (j) => {
     const pr = prompt(j); if (!pr) { j.status = 'error'; j.note = 'unknown kind'; continue; }
     j.status = 'running'; j.started_at = new Date().toISOString();
     await writeFile(JOBS, JSON.stringify(jobs, null, 2));
-    try {
-      await new Promise((resolve, reject) => {
-        const ch = spawn(CLAUDE_BIN, ['-p', pr], { cwd: ROOT, stdio: 'inherit' });
-        ch.on('close', code => code === 0 ? resolve() : reject(new Error('claude exit ' + code)));
-        ch.on('error', reject);
-      });
-      j.status = 'done'; j.finished_at = new Date().toISOString();
-    } catch (e) { j.status = 'error'; j.note = String(e.message).slice(0, 120); }
+    let res, tries = 0;
+    for (;;) {
+      tries++;
+      res = await runClaude(CLAUDE_BIN, pr);
+      j.attempts = tries;
+      if (res.ok) break;
+      // Only retry self-healing API throttles — a real skill/code failure fails fast.
+      if (tries < MAX_TRIES && isTransient(res.err)) {
+        const wait = BACKOFF_MS * tries;
+        j.note = `transient API error (try ${tries}/${MAX_TRIES}) — backing off ${Math.round(wait/1000)}s`;
+        await writeFile(JOBS, JSON.stringify(jobs, null, 2));
+        console.error(`video-runner: ${j.id} ${j.note}`);
+        await sleep(wait);
+        continue;
+      }
+      break;
+    }
+    if (res.ok) { j.status = 'done'; j.finished_at = new Date().toISOString(); delete j.note; }
+    else {
+      j.status = 'error'; j.finished_at = new Date().toISOString();
+      j.note = (isTransient(res.err) ? `rate-limited after ${tries} tr${tries===1?'y':'ies'} — safe to requeue` : ('claude exit ' + res.code))
+        + (res.err ? (' · ' + res.err.replace(/\s+/g, ' ').trim().slice(0, 140)) : '');
+    }
     await writeFile(JOBS, JSON.stringify(jobs, null, 2));
   }
 })().catch(e => { console.error('video-runner FAILED:', e.message); process.exit(1); });

← 96a00f6 Add hypergen daily video-suggestions tab (4 ideas/day, dated  ·  back to Dw Marketing Reels  ·  Harden video-runner: retry transient API rate-limits before 6eb3061 →