[object Object]

← back to Dw Collection Banner Audit

29 room-render banners generated (16:9, settlement-clear), contact sheet, ~$1.16

04bd25e7379eac82357b89257d2d019b2345a314 · 2026-07-30 09:58:03 -0700 · steve

Files touched

Diff

commit 04bd25e7379eac82357b89257d2d019b2345a314
Author: steve <steve@designerwallcoverings.com>
Date:   Thu Jul 30 09:58:03 2026 -0700

    29 room-render banners generated (16:9, settlement-clear), contact sheet, ~$1.16
---
 room_render.py                                     |  94 ++++++++
 room_renders/apartment-wallpaper.png               | Bin 0 -> 2514793 bytes
 room_renders/british-walls.png                     | Bin 0 -> 2137990 bytes
 room_renders/european-wallpapers.png               | Bin 0 -> 2313906 bytes
 room_renders/gaston-nuevo-mundo.png                | Bin 0 -> 2375614 bytes
 room_renders/green-wall-textures.png               | Bin 0 -> 2421551 bytes
 .../hollywood-type-2-wallpaper-collection.png      | Bin 0 -> 2248672 bytes
 .../hollywood-wallpaper-commercial-wallpaper.png   | Bin 0 -> 2323039 bytes
 ...ne-textile-wallcoverings-by-phillipe-romano.png | Bin 0 -> 2095558 bytes
 room_renders/maharam-wallcoverings.png             | Bin 0 -> 2191525 bytes
 room_renders/mark-alexander.png                    | Bin 0 -> 2132609 bytes
 room_renders/material-leather.png                  | Bin 0 -> 2584846 bytes
 room_renders/natural-paint.png                     | Bin 0 -> 2249034 bytes
 room_renders/naturally-glamorous.png               | Bin 0 -> 2473561 bytes
 room_renders/phillipe-romano-asian-essence.png     | Bin 0 -> 2308237 bytes
 room_renders/phillipe-romano-elegante.png          | Bin 0 -> 2257039 bytes
 room_renders/phillipe-romano-enlightenment.png     | Bin 0 -> 2238893 bytes
 .../phillipe-romano-essential-textures.png         | Bin 0 -> 2284643 bytes
 room_renders/phillipe-romano-fabrics.png           | Bin 0 -> 2196360 bytes
 room_renders/phillipe-romano-faux-leather.png      | Bin 0 -> 2293027 bytes
 .../phillipe-romano-monument-collection.png        | Bin 0 -> 2232201 bytes
 .../phillipe-romano-pattern-upholstery.png         | Bin 0 -> 2189193 bytes
 room_renders/phillipe-romano-print-basecloths.png  | Bin 0 -> 2184866 bytes
 room_renders/phillipe-romano-textures-vol-4.png    | Bin 0 -> 2349950 bytes
 .../phillipe-romano-wilderie-collection.png        | Bin 0 -> 2214165 bytes
 room_renders/ronald-redding.png                    | Bin 0 -> 2423934 bytes
 room_renders/surface-stick-3m-self-adhesive.png    | Bin 0 -> 2061432 bytes
 room_renders/surface-stick.png                     | Bin 0 -> 2271448 bytes
 room_renders/tables.png                            | Bin 0 -> 2313033 bytes
 room_renders/throw-blanket.png                     | Bin 0 -> 2261084 bytes
 room_renders_all.json                              | 250 +++++++++++++++++++++
 room_renders_contact_sheet.png                     | Bin 0 -> 3283687 bytes
 room_renders_sample.json                           |  21 ++
 33 files changed, 365 insertions(+)

diff --git a/room_render.py b/room_render.py
new file mode 100644
index 0000000..3c575d9
--- /dev/null
+++ b/room_render.py
@@ -0,0 +1,94 @@
+#!/usr/bin/env python3
+"""
+Room-render banner generator for no-source collections.
+For each: pull a representative product image from the collection, ask
+gemini-2.5-flash-image to place that wallcovering in a photorealistic room,
+save the render locally (NOT uploaded to Shopify yet — that write is gated).
+Usage: python3 room_render.py sample   # first 3
+       python3 room_render.py all       # all 38 genuine no-source
+Reads GEMINI_API_KEY from env. Cost ~$0.01-0.04/render (shown).
+"""
+import json, os, sys, base64, time, urllib.request
+
+HERE = os.path.dirname(os.path.abspath(__file__))
+GKEY = os.environ["GEMINI_API_KEY"]
+STORE = "designer-laboratory-sandbox.myshopify.com"
+UA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)"
+OUT = os.path.join(HERE, "room_renders"); os.makedirs(OUT, exist_ok=True)
+MODEL = "gemini-2.5-flash-image"
+
+rows = json.load(open(os.path.join(HERE, "proposal.json")))
+def w(r):
+    try: return int(r["new_dim"].split("x")[0])
+    except: return 0
+genuine = [r for r in rows if r["status"] == "NO_HIRES_SOURCE" and w(r) < 1000 and (r["products"] or 0) > 0]
+
+ROOMS = ["an elegant modern living room", "a refined dining room", "a luxe bedroom feature wall"]
+
+def product_image(handle):
+    url = f"https://{STORE}/collections/{handle}/products.json?limit=12"
+    prods = None
+    for attempt in range(4):
+        try:
+            prods = json.load(urllib.request.urlopen(urllib.request.Request(url, headers={"User-Agent": UA}), timeout=25)).get("products", [])
+            break
+        except urllib.error.HTTPError as e:
+            if e.code in (403, 429): time.sleep(2.0*(attempt+1)); continue
+            return None
+        except Exception:
+            time.sleep(1.5)
+    if not prods: return None
+    for p in prods:
+        for im in p.get("images", []):
+            if "logo" not in im.get("src","").lower():
+                return im["src"]
+    return None
+
+def fetch_bytes(src):
+    return urllib.request.urlopen(urllib.request.Request(src, headers={"User-Agent": UA}), timeout=30).read()
+
+def gen_room(handle, title, idx):
+    src = product_image(handle)
+    if not src: return {"handle": handle, "ok": False, "note": "no product image"}
+    img_b = fetch_bytes(src)
+    b64 = base64.b64encode(img_b).decode()
+    mime = "image/png" if src.lower().split("?")[0].endswith(".png") else "image/jpeg"
+    room = ROOMS[idx % len(ROOMS)]
+    prompt = (f"Photorealistic interior photograph: the wallcovering pattern shown in the reference image "
+              f"installed on the main wall of {room}. Elegant, luxury interior design, natural lighting, "
+              f"tasteful furniture, magazine-quality. The wallcovering pattern must match the reference exactly. "
+              f"Wide landscape composition suitable for a website banner. No text, no watermark.")
+    body = json.dumps({
+        "contents": [{"parts": [{"text": prompt}, {"inline_data": {"mime_type": mime, "data": b64}}]}],
+        "generationConfig": {"imageConfig": {"aspectRatio": "16:9"}}
+    }).encode()
+    url = f"https://generativelanguage.googleapis.com/v1beta/models/{MODEL}:generateContent?key={GKEY}"
+    req = urllib.request.Request(url, data=body, headers={"Content-Type": "application/json"})
+    try:
+        res = json.load(urllib.request.urlopen(req, timeout=120))
+    except Exception as e:
+        return {"handle": handle, "ok": False, "note": f"api err: {str(e)[:100]}"}
+    # extract inline image
+    try:
+        for part in res["candidates"][0]["content"]["parts"]:
+            d = part.get("inline_data") or part.get("inlineData")
+            if d:
+                out = os.path.join(OUT, f"{handle}.png")
+                open(out, "wb").write(base64.b64decode(d["data"]))
+                return {"handle": handle, "ok": True, "file": out, "src_used": src, "room": room}
+        return {"handle": handle, "ok": False, "note": "no image in response"}
+    except Exception as e:
+        return {"handle": handle, "ok": False, "note": f"parse err: {str(e)[:100]}"}
+
+mode = sys.argv[1] if len(sys.argv) > 1 else "sample"
+target = genuine[:3] if mode == "sample" else genuine
+print(f"generating {len(target)} room-render banners (model {MODEL}, ~$0.04 each -> ~${len(target)*0.04:.2f})")
+results = []
+for i, r in enumerate(target):
+    res = gen_room(r["handle"], r["title"], i)
+    print(("  OK  " if res["ok"] else "  FAIL ") + res["handle"] + ("" if res["ok"] else " :: " + res.get("note","")))
+    results.append(res)
+    time.sleep(1.0)
+json.dump(results, open(os.path.join(HERE, f"room_renders_{mode}.json"), "w"), indent=1)
+ok = sum(1 for r in results if r["ok"])
+print(f"\ndone: {ok}/{len(target)} rendered -> {OUT}   est cost ~${ok*0.04:.2f}")
diff --git a/room_renders/apartment-wallpaper.png b/room_renders/apartment-wallpaper.png
new file mode 100644
index 0000000..20c7bec
Binary files /dev/null and b/room_renders/apartment-wallpaper.png differ
diff --git a/room_renders/british-walls.png b/room_renders/british-walls.png
new file mode 100644
index 0000000..02a4810
Binary files /dev/null and b/room_renders/british-walls.png differ
diff --git a/room_renders/european-wallpapers.png b/room_renders/european-wallpapers.png
new file mode 100644
index 0000000..4e1090c
Binary files /dev/null and b/room_renders/european-wallpapers.png differ
diff --git a/room_renders/gaston-nuevo-mundo.png b/room_renders/gaston-nuevo-mundo.png
new file mode 100644
index 0000000..a022a72
Binary files /dev/null and b/room_renders/gaston-nuevo-mundo.png differ
diff --git a/room_renders/green-wall-textures.png b/room_renders/green-wall-textures.png
new file mode 100644
index 0000000..801e0ef
Binary files /dev/null and b/room_renders/green-wall-textures.png differ
diff --git a/room_renders/hollywood-type-2-wallpaper-collection.png b/room_renders/hollywood-type-2-wallpaper-collection.png
new file mode 100644
index 0000000..8eef6e7
Binary files /dev/null and b/room_renders/hollywood-type-2-wallpaper-collection.png differ
diff --git a/room_renders/hollywood-wallpaper-commercial-wallpaper.png b/room_renders/hollywood-wallpaper-commercial-wallpaper.png
new file mode 100644
index 0000000..c927dd4
Binary files /dev/null and b/room_renders/hollywood-wallpaper-commercial-wallpaper.png differ
diff --git a/room_renders/luxuria-fine-textile-wallcoverings-by-phillipe-romano.png b/room_renders/luxuria-fine-textile-wallcoverings-by-phillipe-romano.png
new file mode 100644
index 0000000..770c6cb
Binary files /dev/null and b/room_renders/luxuria-fine-textile-wallcoverings-by-phillipe-romano.png differ
diff --git a/room_renders/maharam-wallcoverings.png b/room_renders/maharam-wallcoverings.png
new file mode 100644
index 0000000..70331bd
Binary files /dev/null and b/room_renders/maharam-wallcoverings.png differ
diff --git a/room_renders/mark-alexander.png b/room_renders/mark-alexander.png
new file mode 100644
index 0000000..d88ac48
Binary files /dev/null and b/room_renders/mark-alexander.png differ
diff --git a/room_renders/material-leather.png b/room_renders/material-leather.png
new file mode 100644
index 0000000..ec82c96
Binary files /dev/null and b/room_renders/material-leather.png differ
diff --git a/room_renders/natural-paint.png b/room_renders/natural-paint.png
new file mode 100644
index 0000000..5b5070c
Binary files /dev/null and b/room_renders/natural-paint.png differ
diff --git a/room_renders/naturally-glamorous.png b/room_renders/naturally-glamorous.png
new file mode 100644
index 0000000..1c872f9
Binary files /dev/null and b/room_renders/naturally-glamorous.png differ
diff --git a/room_renders/phillipe-romano-asian-essence.png b/room_renders/phillipe-romano-asian-essence.png
new file mode 100644
index 0000000..19279c2
Binary files /dev/null and b/room_renders/phillipe-romano-asian-essence.png differ
diff --git a/room_renders/phillipe-romano-elegante.png b/room_renders/phillipe-romano-elegante.png
new file mode 100644
index 0000000..735bc4a
Binary files /dev/null and b/room_renders/phillipe-romano-elegante.png differ
diff --git a/room_renders/phillipe-romano-enlightenment.png b/room_renders/phillipe-romano-enlightenment.png
new file mode 100644
index 0000000..d7d22ab
Binary files /dev/null and b/room_renders/phillipe-romano-enlightenment.png differ
diff --git a/room_renders/phillipe-romano-essential-textures.png b/room_renders/phillipe-romano-essential-textures.png
new file mode 100644
index 0000000..1225d34
Binary files /dev/null and b/room_renders/phillipe-romano-essential-textures.png differ
diff --git a/room_renders/phillipe-romano-fabrics.png b/room_renders/phillipe-romano-fabrics.png
new file mode 100644
index 0000000..004536f
Binary files /dev/null and b/room_renders/phillipe-romano-fabrics.png differ
diff --git a/room_renders/phillipe-romano-faux-leather.png b/room_renders/phillipe-romano-faux-leather.png
new file mode 100644
index 0000000..9b17d03
Binary files /dev/null and b/room_renders/phillipe-romano-faux-leather.png differ
diff --git a/room_renders/phillipe-romano-monument-collection.png b/room_renders/phillipe-romano-monument-collection.png
new file mode 100644
index 0000000..14ec33d
Binary files /dev/null and b/room_renders/phillipe-romano-monument-collection.png differ
diff --git a/room_renders/phillipe-romano-pattern-upholstery.png b/room_renders/phillipe-romano-pattern-upholstery.png
new file mode 100644
index 0000000..91157c6
Binary files /dev/null and b/room_renders/phillipe-romano-pattern-upholstery.png differ
diff --git a/room_renders/phillipe-romano-print-basecloths.png b/room_renders/phillipe-romano-print-basecloths.png
new file mode 100644
index 0000000..f36e21d
Binary files /dev/null and b/room_renders/phillipe-romano-print-basecloths.png differ
diff --git a/room_renders/phillipe-romano-textures-vol-4.png b/room_renders/phillipe-romano-textures-vol-4.png
new file mode 100644
index 0000000..f4fb4ee
Binary files /dev/null and b/room_renders/phillipe-romano-textures-vol-4.png differ
diff --git a/room_renders/phillipe-romano-wilderie-collection.png b/room_renders/phillipe-romano-wilderie-collection.png
new file mode 100644
index 0000000..c168731
Binary files /dev/null and b/room_renders/phillipe-romano-wilderie-collection.png differ
diff --git a/room_renders/ronald-redding.png b/room_renders/ronald-redding.png
new file mode 100644
index 0000000..34238fa
Binary files /dev/null and b/room_renders/ronald-redding.png differ
diff --git a/room_renders/surface-stick-3m-self-adhesive.png b/room_renders/surface-stick-3m-self-adhesive.png
new file mode 100644
index 0000000..99796e0
Binary files /dev/null and b/room_renders/surface-stick-3m-self-adhesive.png differ
diff --git a/room_renders/surface-stick.png b/room_renders/surface-stick.png
new file mode 100644
index 0000000..1a3a372
Binary files /dev/null and b/room_renders/surface-stick.png differ
diff --git a/room_renders/tables.png b/room_renders/tables.png
new file mode 100644
index 0000000..8bab417
Binary files /dev/null and b/room_renders/tables.png differ
diff --git a/room_renders/throw-blanket.png b/room_renders/throw-blanket.png
new file mode 100644
index 0000000..10b58b2
Binary files /dev/null and b/room_renders/throw-blanket.png differ
diff --git a/room_renders_all.json b/room_renders_all.json
new file mode 100644
index 0000000..27c71dd
--- /dev/null
+++ b/room_renders_all.json
@@ -0,0 +1,250 @@
+[
+ {
+  "handle": "apartment-wallpaper",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/apartment-wallpaper.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/PSW1113RL.jpg?v=1740774986",
+  "room": "an elegant modern living room"
+ },
+ {
+  "handle": "benu-recycled",
+  "ok": false,
+  "note": "no product image"
+ },
+ {
+  "handle": "british-walls",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/british-walls.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/93a7007651f206f845f9748e35512953.jpg?v=1572309861",
+  "room": "a luxe bedroom feature wall"
+ },
+ {
+  "handle": "collezione-italia",
+  "ok": false,
+  "note": "no product image"
+ },
+ {
+  "handle": "european-wallpapers",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/european-wallpapers.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/abaca_3eauctnpzewfnc2v.jpg?v=1782461830",
+  "room": "a refined dining room"
+ },
+ {
+  "handle": "gaston-nuevo-mundo",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/gaston-nuevo-mundo.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/GDT5566_001_ed4a7108-c9dc-4f51-8030-ec977a5adbdd.jpg?v=1738179846",
+  "room": "a luxe bedroom feature wall"
+ },
+ {
+  "handle": "green-wall-textures",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/green-wall-textures.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/billy-burlap-grs-9039-cropped.jpg?v=1774341288",
+  "room": "an elegant modern living room"
+ },
+ {
+  "handle": "hermes",
+  "ok": false,
+  "note": "no product image"
+ },
+ {
+  "handle": "hinson",
+  "ok": false,
+  "note": "no product image"
+ },
+ {
+  "handle": "hollywood-wallpaper-commercial-wallpaper",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/hollywood-wallpaper-commercial-wallpaper.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/DUR-72460-sample-clean.jpg?v=1774485650",
+  "room": "an elegant modern living room"
+ },
+ {
+  "handle": "hollywood-type-2-wallpaper-collection",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/hollywood-type-2-wallpaper-collection.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/circ_panel-iron.jpg?v=1785423738",
+  "room": "a refined dining room"
+ },
+ {
+  "handle": "material-leather",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/material-leather.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/RS15051_image1.jpg?v=1756312793",
+  "room": "a luxe bedroom feature wall"
+ },
+ {
+  "handle": "luxuria-fine-textile-wallcoverings-by-phillipe-romano",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/luxuria-fine-textile-wallcoverings-by-phillipe-romano.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/2090_quadrat_80cc13fd-c965-480e-8c93-e2480ff15bd8.jpg?v=1576170487",
+  "room": "an elegant modern living room"
+ },
+ {
+  "handle": "maharam-wallcoverings",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/maharam-wallcoverings.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/MH-ESKER-007_0.jpg?v=1785419247",
+  "room": "a refined dining room"
+ },
+ {
+  "handle": "mark-alexander",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/mark-alexander.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/MW110-03-kami-lake_03_50d9cb5c-8dae-41f2-afe6-547a8bd539fd.jpg?v=1775598512",
+  "room": "a luxe bedroom feature wall"
+ },
+ {
+  "handle": "natural-paint",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/natural-paint.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/c7ee6b6518ea1c535e2461b3b45bf226.jpg?v=1572309829",
+  "room": "an elegant modern living room"
+ },
+ {
+  "handle": "naturally-glamorous",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/naturally-glamorous.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/hlw-73042-sample-gregory-diamonds-drive-hollywood-wallcoverings.jpg?v=1775714870",
+  "room": "a refined dining room"
+ },
+ {
+  "handle": "nlxl",
+  "ok": false,
+  "note": "no product image"
+ },
+ {
+  "handle": "paul-montgomery-all-products",
+  "ok": false,
+  "note": "no product image"
+ },
+ {
+  "handle": "paul-montgomery-murals",
+  "ok": false,
+  "note": "no product image"
+ },
+ {
+  "handle": "phillip-jeffries",
+  "ok": false,
+  "note": "no product image"
+ },
+ {
+  "handle": "phillipe-romano-enlightenment",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/phillipe-romano-enlightenment.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/prw-920396-innovations_fuse-fus-001-barium-01.jpg?v=1781715896",
+  "room": "an elegant modern living room"
+ },
+ {
+  "handle": "phillipe-romano-faux-leather",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/phillipe-romano-faux-leather.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/TR-VT-01_0f374878-69d0-4656-9fc2-ba0b4e44bca4.jpg?v=1733889811",
+  "room": "a refined dining room"
+ },
+ {
+  "handle": "phillipe-romano-monument-collection",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/phillipe-romano-monument-collection.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/grs-20492-cropped.jpg?v=1774345427",
+  "room": "a luxe bedroom feature wall"
+ },
+ {
+  "handle": "phillipe-romano-pattern-upholstery",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/phillipe-romano-pattern-upholstery.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/ScreenShot2023-01-13at12.59.59PM.png?v=1745455417",
+  "room": "an elegant modern living room"
+ },
+ {
+  "handle": "phillipe-romano-print-basecloths",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/phillipe-romano-print-basecloths.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/T2-BL-11_a321a15d-f92e-4833-81e7-1559488db75c.jpg?v=1733891640",
+  "room": "a refined dining room"
+ },
+ {
+  "handle": "phillipe-romano-wilderie-collection",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/phillipe-romano-wilderie-collection.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/ScreenShot2023-01-13at12.59.59PM.png?v=1745455417",
+  "room": "a luxe bedroom feature wall"
+ },
+ {
+  "handle": "phillipe-romano-asian-essence",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/phillipe-romano-asian-essence.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/WOS3471_WT_ba85ae6e-2aef-4f79-8bec-e8d28a5c4f34.jpg?v=1753317602",
+  "room": "an elegant modern living room"
+ },
+ {
+  "handle": "phillipe-romano-elegante",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/phillipe-romano-elegante.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/W3839_106_8341302d-92e0-4490-92ac-8d6eb7858fc0.jpg?v=1753290523",
+  "room": "a refined dining room"
+ },
+ {
+  "handle": "phillipe-romano-essential-textures",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/phillipe-romano-essential-textures.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/f8e389c16f71245906b0d75c6ffdc549_5a65ac67-a446-4bcf-a5dc-9d78c58702cb.jpg?v=1572310382",
+  "room": "a luxe bedroom feature wall"
+ },
+ {
+  "handle": "phillipe-romano-fabrics",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/phillipe-romano-fabrics.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/9b289f123d712ff505fcd084dafc6128.jpg?v=1734632259",
+  "room": "an elegant modern living room"
+ },
+ {
+  "handle": "phillipe-romano-faux-leathers-upholstery-more",
+  "ok": false,
+  "note": "no product image"
+ },
+ {
+  "handle": "phillipe-romano-textures-vol-4",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/phillipe-romano-textures-vol-4.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/85a79b6b9caa3dc82b75057671150b71.jpg?v=1745458523",
+  "room": "a luxe bedroom feature wall"
+ },
+ {
+  "handle": "ronald-redding",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/ronald-redding.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/W3744_5_5b39a56c-7391-4d7c-b421-2c7ac397d32b.jpg?v=1753292001",
+  "room": "an elegant modern living room"
+ },
+ {
+  "handle": "surface-stick",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/surface-stick.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/007bf2c5f1d16fe0cf685c3c251b258f.jpg?v=1572309697",
+  "room": "a refined dining room"
+ },
+ {
+  "handle": "surface-stick-3m-self-adhesive",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/surface-stick-3m-self-adhesive.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/007bf2c5f1d16fe0cf685c3c251b258f.jpg?v=1572309697",
+  "room": "a luxe bedroom feature wall"
+ },
+ {
+  "handle": "tables",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/tables.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/wood-black-self-adhesive-film-jeffrey-stevens.jpg?v=1783972211",
+  "room": "an elegant modern living room"
+ },
+ {
+  "handle": "throw-blanket",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/throw-blanket.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/11859510-dig-762164-chibabay-blue-by-designerwallcoverings_19-1_a3ea7102-1f49-4d97-9c9b-15dd0926b182.jpg?v=1630525797",
+  "room": "a refined dining room"
+ }
+]
\ No newline at end of file
diff --git a/room_renders_contact_sheet.png b/room_renders_contact_sheet.png
new file mode 100644
index 0000000..ff05e94
Binary files /dev/null and b/room_renders_contact_sheet.png differ
diff --git a/room_renders_sample.json b/room_renders_sample.json
new file mode 100644
index 0000000..8c794bf
--- /dev/null
+++ b/room_renders_sample.json
@@ -0,0 +1,21 @@
+[
+ {
+  "handle": "apartment-wallpaper",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/apartment-wallpaper.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/PSW1113RL.jpg?v=1740774986",
+  "room": "an elegant modern living room"
+ },
+ {
+  "handle": "benu-recycled",
+  "ok": false,
+  "note": "no product image"
+ },
+ {
+  "handle": "british-walls",
+  "ok": true,
+  "file": "/Users/macstudio3/Projects/dw-collection-banner-audit/room_renders/british-walls.png",
+  "src_used": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/93a7007651f206f845f9748e35512953.jpg?v=1572309861",
+  "room": "a luxe bedroom feature wall"
+ }
+]
\ No newline at end of file

← 17c3bca auto-save: 2026-07-30T09:46:44 (2 files) — apply_live.py rol  ·  back to Dw Collection Banner Audit  ·  landed 29 room-render banners live (custom+smart), 29/29 ok, 0917475 →