[object Object]

← back to Wallco Ai

api/designs: filter out rows whose image file is missing on disk

39b4997c66e2e56d343cd45709532c1c2cbb355a · 2026-05-13 12:39:19 -0700 · SteveStudio2

Steve's standing rule (2026-05-13): nothing — /designs, hot-or-not,
random — shows a row unless the PNG actually exists. Drag-down for
the 266 designs (3062 DB rows vs 2796 files) that were rendering as
blank tiles.

Implementation:
- imageFilesOnDisk() — cached Set of fs.readdirSync(IMG_DIR), refreshed
  every 5 min. Cheap O(1) membership checks.
- designHasImage(d) — checks d.filename or extracts from d.image_url.
- /api/designs and /api/designs/random both filter through this.
- 5-min TTL handles new arrivals from generators without restart.

Side effect: total count drops from 3062 → ~2796 in the API response.
Better to undercount than show broken tiles.

Files touched

Diff

commit 39b4997c66e2e56d343cd45709532c1c2cbb355a
Author: SteveStudio2 <stevestudio2@SteveStacStudio.lan>
Date:   Wed May 13 12:39:19 2026 -0700

    api/designs: filter out rows whose image file is missing on disk
    
    Steve's standing rule (2026-05-13): nothing — /designs, hot-or-not,
    random — shows a row unless the PNG actually exists. Drag-down for
    the 266 designs (3062 DB rows vs 2796 files) that were rendering as
    blank tiles.
    
    Implementation:
    - imageFilesOnDisk() — cached Set of fs.readdirSync(IMG_DIR), refreshed
      every 5 min. Cheap O(1) membership checks.
    - designHasImage(d) — checks d.filename or extracts from d.image_url.
    - /api/designs and /api/designs/random both filter through this.
    - 5-min TTL handles new arrivals from generators without restart.
    
    Side effect: total count drops from 3062 → ~2796 in the API response.
    Better to undercount than show broken tiles.
---
 data/designs.json                            | 2311 +++++++++++++++++++++++++-
 scripts/dig1984_facesup_master_preprocess.js |   85 +
 scripts/dig1984_facesup_smoke_test.js        |  133 ++
 server.js                                    |   40 +-
 4 files changed, 2548 insertions(+), 21 deletions(-)

diff --git a/data/designs.json b/data/designs.json
index 5f0a813..93c8409 100644
--- a/data/designs.json
+++ b/data/designs.json
@@ -67123,7 +67123,7 @@
     "filename": "bt_1778695676553_1191751097.png",
     "generator": "wallco.ai",
     "seed": 1191751097,
-    "is_published": true,
+    "is_published": false,
     "created_at": "2026-05-13T18:07:56.688375+00:00",
     "motifs": [
       "butterfly",
@@ -67149,7 +67149,7 @@
     "filename": "bt_1778695686911_2121127537.png",
     "generator": "wallco.ai",
     "seed": 2121127537,
-    "is_published": true,
+    "is_published": false,
     "created_at": "2026-05-13T18:08:07.054156+00:00",
     "motifs": [
       "butterfly",
@@ -67219,7 +67219,7 @@
     "filename": "bt_1778695694804_1311940280.png",
     "generator": "wallco.ai",
     "seed": 1311940280,
-    "is_published": true,
+    "is_published": false,
     "created_at": "2026-05-13T18:08:14.930347+00:00",
     "motifs": [
       "butterfly",
@@ -71723,7 +71723,7 @@
     "filename": "dig1984_1778699623981_344265643.png",
     "generator": "wallco.ai",
     "seed": 344265643,
-    "is_published": true,
+    "is_published": false,
     "created_at": "2026-05-13T19:13:44.103949+00:00",
     "motifs": [
       "floral",
@@ -71750,7 +71750,7 @@
     "filename": "dig1984_1778699631571_1182755576.png",
     "generator": "wallco.ai",
     "seed": 1182755576,
-    "is_published": true,
+    "is_published": false,
     "created_at": "2026-05-13T19:13:51.699512+00:00",
     "motifs": [
       "floral",
@@ -71777,7 +71777,7 @@
     "filename": "dig1984_1778699640562_1781499009.png",
     "generator": "wallco.ai",
     "seed": 1781499009,
-    "is_published": true,
+    "is_published": false,
     "created_at": "2026-05-13T19:14:00.686+00:00",
     "motifs": [
       "floral",
@@ -71804,7 +71804,7 @@
     "filename": "dig1984_1778699648235_1304339388.png",
     "generator": "wallco.ai",
     "seed": 1304339388,
-    "is_published": true,
+    "is_published": false,
     "created_at": "2026-05-13T19:14:08.459427+00:00",
     "motifs": [
       "floral",
@@ -71875,7 +71875,7 @@
     "filename": "dig1984_1778699657258_998252679.png",
     "generator": "wallco.ai",
     "seed": 998252679,
-    "is_published": true,
+    "is_published": false,
     "created_at": "2026-05-13T19:14:17.373303+00:00",
     "motifs": [
       "floral",
@@ -71902,7 +71902,7 @@
     "filename": "dig1984_1778699664718_784717064.png",
     "generator": "wallco.ai",
     "seed": 784717064,
-    "is_published": true,
+    "is_published": false,
     "created_at": "2026-05-13T19:14:24.851997+00:00",
     "motifs": [
       "floral",
@@ -71929,7 +71929,7 @@
     "filename": "dig1984_1778699674623_1900836927.png",
     "generator": "wallco.ai",
     "seed": 1900836927,
-    "is_published": true,
+    "is_published": false,
     "created_at": "2026-05-13T19:14:34.749891+00:00",
     "motifs": [
       "floral",
@@ -71956,7 +71956,7 @@
     "filename": "dig1984_1778699682239_1550949847.png",
     "generator": "wallco.ai",
     "seed": 1550949847,
-    "is_published": true,
+    "is_published": false,
     "created_at": "2026-05-13T19:14:42.359749+00:00",
     "motifs": [
       "floral",
@@ -71983,7 +71983,7 @@
     "filename": "dig1984_1778699690522_130051995.png",
     "generator": "wallco.ai",
     "seed": 130051995,
-    "is_published": true,
+    "is_published": false,
     "created_at": "2026-05-13T19:14:51.524677+00:00",
     "motifs": [
       "floral",
@@ -72010,7 +72010,7 @@
     "filename": "dig1984_1778699699762_2138836705.png",
     "generator": "wallco.ai",
     "seed": 2138836705,
-    "is_published": true,
+    "is_published": false,
     "created_at": "2026-05-13T19:14:59.897359+00:00",
     "motifs": [
       "floral",
@@ -72037,7 +72037,7 @@
     "filename": "dig1984_1778699707050_1568366990.png",
     "generator": "wallco.ai",
     "seed": 1568366990,
-    "is_published": true,
+    "is_published": false,
     "created_at": "2026-05-13T19:15:07.174861+00:00",
     "motifs": [
       "floral",
@@ -72064,7 +72064,7 @@
     "filename": "dig1984_1778699715240_2116154951.png",
     "generator": "wallco.ai",
     "seed": 2116154951,
-    "is_published": true,
+    "is_published": false,
     "created_at": "2026-05-13T19:15:15.367337+00:00",
     "motifs": [
       "floral",
@@ -72091,7 +72091,7 @@
     "filename": "dig1984_1778699723292_657474069.png",
     "generator": "wallco.ai",
     "seed": 657474069,
-    "is_published": true,
+    "is_published": false,
     "created_at": "2026-05-13T19:15:23.424239+00:00",
     "motifs": [
       "floral",
@@ -72118,7 +72118,7 @@
     "filename": "dig1984_1778699730782_1421708586.png",
     "generator": "wallco.ai",
     "seed": 1421708586,
-    "is_published": true,
+    "is_published": false,
     "created_at": "2026-05-13T19:15:30.916211+00:00",
     "motifs": [
       "floral",
@@ -72145,7 +72145,7 @@
     "filename": "dig1984_1778699739126_597530073.png",
     "generator": "wallco.ai",
     "seed": 597530073,
-    "is_published": true,
+    "is_published": false,
     "created_at": "2026-05-13T19:15:39.257374+00:00",
     "motifs": [
       "floral",
@@ -72203,5 +72203,2280 @@
     "user_scale_good": null,
     "user_stars": null,
     "room_mockups": []
+  },
+  {
+    "id": 3510,
+    "kind": "seamless_tile",
+    "category": "colorways-imperial-garden-barone",
+    "dominant_hex": "#25304d",
+    "saturation": 0.351,
+    "title": "Sapphire Atelier No.3510",
+    "handle": "wallco-3510",
+    "image_url": "/designs/img/dig1984_1778699747752_202735983.png",
+    "filename": "dig1984_1778699747752_202735983.png",
+    "generator": "wallco.ai",
+    "seed": 202735983,
+    "is_published": false,
+    "created_at": "2026-05-13T19:15:47.862697+00:00",
+    "motifs": [
+      "floral",
+      "garden",
+      "chinoiserie",
+      "traditional"
+    ],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3511,
+    "kind": "seamless_tile",
+    "category": "colorways-imperial-garden-barone",
+    "dominant_hex": "#485a77",
+    "saturation": 0.246,
+    "title": "Sapphire Studio No.3511",
+    "handle": "wallco-3511",
+    "image_url": "/designs/img/dig1984_1778699758497_1226382480.png",
+    "filename": "dig1984_1778699758497_1226382480.png",
+    "generator": "wallco.ai",
+    "seed": 1226382480,
+    "is_published": false,
+    "created_at": "2026-05-13T19:15:58.62828+00:00",
+    "motifs": [
+      "floral",
+      "garden",
+      "chinoiserie",
+      "traditional"
+    ],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3512,
+    "kind": "seamless_tile",
+    "category": "colorways-imperial-garden-barone",
+    "dominant_hex": "#829cc0",
+    "saturation": 0.33,
+    "title": "Sapphire Origin No.3512",
+    "handle": "wallco-3512",
+    "image_url": "/designs/img/dig1984_1778699768535_252722271.png",
+    "filename": "dig1984_1778699768535_252722271.png",
+    "generator": "wallco.ai",
+    "seed": 252722271,
+    "is_published": false,
+    "created_at": "2026-05-13T19:16:08.704964+00:00",
+    "motifs": [
+      "floral",
+      "garden",
+      "chinoiserie",
+      "traditional"
+    ],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3513,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#080707",
+    "saturation": 0.067,
+    "title": "Noir Atelier No.3513",
+    "handle": "wallco-3513",
+    "image_url": "/designs/img/1778699763293_1291741812.png",
+    "filename": "1778699763293_1291741812.png",
+    "generator": "wallco.ai",
+    "seed": 1291741812,
+    "is_published": false,
+    "created_at": "2026-05-13T19:16:15.116894+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3514,
+    "kind": "seamless_tile",
+    "category": "colorways-imperial-garden-barone",
+    "dominant_hex": "#458080",
+    "saturation": 0.299,
+    "title": "Marine Reverie No.3514",
+    "handle": "wallco-3514",
+    "image_url": "/designs/img/dig1984_1778699776330_1654982242.png",
+    "filename": "dig1984_1778699776330_1654982242.png",
+    "generator": "wallco.ai",
+    "seed": 1654982242,
+    "is_published": false,
+    "created_at": "2026-05-13T19:16:16.454777+00:00",
+    "motifs": [
+      "floral",
+      "garden",
+      "chinoiserie",
+      "traditional"
+    ],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3515,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#080707",
+    "saturation": 0.067,
+    "title": "Noir Baroque No.3515",
+    "handle": "wallco-3515",
+    "image_url": "/designs/img/var_3513_hue+60_1778699775226.png",
+    "filename": "var_3513_hue+60_1778699775226.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:16:17.460132+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3516,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#080707",
+    "saturation": 0.067,
+    "title": "Noir Damask No.3516",
+    "handle": "wallco-3516",
+    "image_url": "/designs/img/var_3513_hue+120_1778699777465.png",
+    "filename": "var_3513_hue+120_1778699777465.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:16:19.680563+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3517,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#080707",
+    "saturation": 0.067,
+    "title": "Noir Heirloom No.3517",
+    "handle": "wallco-3517",
+    "image_url": "/designs/img/var_3513_hue+180_1778699779684.png",
+    "filename": "var_3513_hue+180_1778699779684.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:16:21.874827+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3518,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#080707",
+    "saturation": 0.067,
+    "title": "Noir Atelier No.3518",
+    "handle": "wallco-3518",
+    "image_url": "/designs/img/var_3513_hue-60_1778699781878.png",
+    "filename": "var_3513_hue-60_1778699781878.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:16:24.164836+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3519,
+    "kind": "seamless_tile",
+    "category": "colorways-imperial-garden-barone",
+    "dominant_hex": "#c2dede",
+    "saturation": 0.298,
+    "title": "Marine Reverie No.3519",
+    "handle": "wallco-3519",
+    "image_url": "/designs/img/dig1984_1778699784057_2066543702.png",
+    "filename": "dig1984_1778699784057_2066543702.png",
+    "generator": "wallco.ai",
+    "seed": 2066543702,
+    "is_published": false,
+    "created_at": "2026-05-13T19:16:24.177319+00:00",
+    "motifs": [
+      "floral",
+      "garden",
+      "chinoiserie",
+      "traditional"
+    ],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3520,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#080707",
+    "saturation": 0.067,
+    "title": "Noir Baroque No.3520",
+    "handle": "wallco-3520",
+    "image_url": "/designs/img/var_3513_mono_1778699784170.png",
+    "filename": "var_3513_mono_1778699784170.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:16:26.45157+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3521,
+    "kind": "seamless_tile",
+    "category": "drunk-animals",
+    "dominant_hex": "#41454c",
+    "saturation": 0.078,
+    "title": "Slate Tipple No.3521",
+    "handle": "wallco-3521",
+    "image_url": "/designs/img/1778699779466_1807844326.png",
+    "filename": "1778699779466_1807844326.png",
+    "generator": "wallco.ai",
+    "seed": 1807844326,
+    "is_published": false,
+    "created_at": "2026-05-13T19:16:27.740481+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3522,
+    "kind": "seamless_tile",
+    "category": "colorways-imperial-garden-barone",
+    "dominant_hex": "#f3e5e3",
+    "saturation": 0.4,
+    "title": "Rose Origin No.3522",
+    "handle": "wallco-3522",
+    "image_url": "/designs/img/dig1984_1778699792661_670103834.png",
+    "filename": "dig1984_1778699792661_670103834.png",
+    "generator": "wallco.ai",
+    "seed": 670103834,
+    "is_published": false,
+    "created_at": "2026-05-13T19:16:32.776536+00:00",
+    "motifs": [
+      "floral",
+      "garden",
+      "chinoiserie",
+      "traditional"
+    ],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3523,
+    "kind": "seamless_tile",
+    "category": "colorways-imperial-garden-barone",
+    "dominant_hex": "#c19795",
+    "saturation": 0.262,
+    "title": "Rose Folio No.3523",
+    "handle": "wallco-3523",
+    "image_url": "/designs/img/dig1984_1778699800627_313677200.png",
+    "filename": "dig1984_1778699800627_313677200.png",
+    "generator": "wallco.ai",
+    "seed": 313677200,
+    "is_published": false,
+    "created_at": "2026-05-13T19:16:40.746589+00:00",
+    "motifs": [
+      "floral",
+      "garden",
+      "chinoiserie",
+      "traditional"
+    ],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3524,
+    "kind": "seamless_tile",
+    "category": "colorways-imperial-garden-barone",
+    "dominant_hex": "#f8cebf",
+    "saturation": 0.803,
+    "title": "Amber Reverie No.3524",
+    "handle": "wallco-3524",
+    "image_url": "/designs/img/dig1984_1778699809966_826521804.png",
+    "filename": "dig1984_1778699809966_826521804.png",
+    "generator": "wallco.ai",
+    "seed": 826521804,
+    "is_published": false,
+    "created_at": "2026-05-13T19:16:50.130997+00:00",
+    "motifs": [
+      "floral",
+      "garden",
+      "chinoiserie",
+      "traditional"
+    ],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3525,
+    "kind": "seamless_tile",
+    "category": "colorways-imperial-garden-barone",
+    "dominant_hex": "#f4cebf",
+    "saturation": 0.707,
+    "title": "Amber Atelier No.3525",
+    "handle": "wallco-3525",
+    "image_url": "/designs/img/dig1984_1778699818504_1093920796.png",
+    "filename": "dig1984_1778699818504_1093920796.png",
+    "generator": "wallco.ai",
+    "seed": 1093920796,
+    "is_published": false,
+    "created_at": "2026-05-13T19:16:58.625675+00:00",
+    "motifs": [
+      "floral",
+      "garden",
+      "chinoiserie",
+      "traditional"
+    ],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3526,
+    "kind": "seamless_tile",
+    "category": "colorways-imperial-garden-barone",
+    "dominant_hex": "#be7f61",
+    "saturation": 0.417,
+    "title": "Amber Studio No.3526",
+    "handle": "wallco-3526",
+    "image_url": "/designs/img/dig1984_1778699826825_1148176203.png",
+    "filename": "dig1984_1778699826825_1148176203.png",
+    "generator": "wallco.ai",
+    "seed": 1148176203,
+    "is_published": false,
+    "created_at": "2026-05-13T19:17:06.966354+00:00",
+    "motifs": [
+      "floral",
+      "garden",
+      "chinoiserie",
+      "traditional"
+    ],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3527,
+    "kind": "seamless_tile",
+    "category": "drunk-animals",
+    "dominant_hex": "#384252",
+    "saturation": 0.188,
+    "title": "Sapphire Caprice No.3527",
+    "handle": "wallco-3527",
+    "image_url": "/designs/img/1778699821330_1764505517.png",
+    "filename": "1778699821330_1764505517.png",
+    "generator": "wallco.ai",
+    "seed": 1764505517,
+    "is_published": false,
+    "created_at": "2026-05-13T19:17:10.301538+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3528,
+    "kind": "seamless_tile",
+    "category": "stoned-animals",
+    "dominant_hex": "#2a2c36",
+    "saturation": 0.125,
+    "title": "Sapphire Lullaby No.3528",
+    "handle": "wallco-3528",
+    "image_url": "/designs/img/1778699821460_717897529.png",
+    "filename": "1778699821460_717897529.png",
+    "generator": "wallco.ai",
+    "seed": 717897529,
+    "is_published": false,
+    "created_at": "2026-05-13T19:17:13.116525+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3529,
+    "kind": "seamless_tile",
+    "category": "colorways-imperial-garden-barone",
+    "dominant_hex": "#4c2526",
+    "saturation": 0.345,
+    "title": "Rose Reverie No.3529",
+    "handle": "wallco-3529",
+    "image_url": "/designs/img/dig1984_1778699835727_1378767577.png",
+    "filename": "dig1984_1778699835727_1378767577.png",
+    "generator": "wallco.ai",
+    "seed": 1378767577,
+    "is_published": false,
+    "created_at": "2026-05-13T19:17:15.85979+00:00",
+    "motifs": [
+      "floral",
+      "garden",
+      "chinoiserie",
+      "traditional"
+    ],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3530,
+    "kind": "seamless_tile",
+    "category": "colorways-imperial-garden-barone",
+    "dominant_hex": "#562c32",
+    "saturation": 0.323,
+    "title": "Rose Atelier No.3530",
+    "handle": "wallco-3530",
+    "image_url": "/designs/img/dig1984_1778699844490_1751571732.png",
+    "filename": "dig1984_1778699844490_1751571732.png",
+    "generator": "wallco.ai",
+    "seed": 1751571732,
+    "is_published": false,
+    "created_at": "2026-05-13T19:17:24.617195+00:00",
+    "motifs": [
+      "floral",
+      "garden",
+      "chinoiserie",
+      "traditional"
+    ],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3531,
+    "kind": "seamless_tile",
+    "category": "colorways-imperial-garden-barone",
+    "dominant_hex": "#ca8a80",
+    "saturation": 0.411,
+    "title": "Rose Studio No.3531",
+    "handle": "wallco-3531",
+    "image_url": "/designs/img/dig1984_1778699857649_955896824.png",
+    "filename": "dig1984_1778699857649_955896824.png",
+    "generator": "wallco.ai",
+    "seed": 955896824,
+    "is_published": false,
+    "created_at": "2026-05-13T19:17:37.809414+00:00",
+    "motifs": [
+      "floral",
+      "garden",
+      "chinoiserie",
+      "traditional"
+    ],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3532,
+    "kind": "seamless_tile",
+    "category": "drunk-animals",
+    "dominant_hex": "#a03e36",
+    "saturation": 0.495,
+    "title": "Rose Tableau No.3532",
+    "handle": "wallco-3532",
+    "image_url": "/designs/img/1778699911347_138360587.png",
+    "filename": "1778699911347_138360587.png",
+    "generator": "wallco.ai",
+    "seed": 138360587,
+    "is_published": false,
+    "created_at": "2026-05-13T19:18:42.94946+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3533,
+    "kind": "seamless_tile",
+    "category": "stoned-animals",
+    "dominant_hex": "#344230",
+    "saturation": 0.158,
+    "title": "Sage Daydream No.3533",
+    "handle": "wallco-3533",
+    "image_url": "/designs/img/1778699911476_1020461735.png",
+    "filename": "1778699911476_1020461735.png",
+    "generator": "wallco.ai",
+    "seed": 1020461735,
+    "is_published": false,
+    "created_at": "2026-05-13T19:18:46.518352+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3534,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#674632",
+    "saturation": 0.346,
+    "title": "Amber Salon No.3534",
+    "handle": "wallco-3534",
+    "image_url": "/designs/img/1778699955353_1180188388.png",
+    "filename": "1778699955353_1180188388.png",
+    "generator": "wallco.ai",
+    "seed": 1180188388,
+    "is_published": false,
+    "created_at": "2026-05-13T19:19:23.768504+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3535,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#674632",
+    "saturation": 0.346,
+    "title": "Amber Baroque No.3535",
+    "handle": "wallco-3535",
+    "image_url": "/designs/img/var_3534_hue+60_1778699963875.png",
+    "filename": "var_3534_hue+60_1778699963875.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:19:25.924913+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3536,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#674632",
+    "saturation": 0.346,
+    "title": "Amber Damask No.3536",
+    "handle": "wallco-3536",
+    "image_url": "/designs/img/var_3534_hue+120_1778699965929.png",
+    "filename": "var_3534_hue+120_1778699965929.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:19:28.009547+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3537,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#674632",
+    "saturation": 0.346,
+    "title": "Amber Heirloom No.3537",
+    "handle": "wallco-3537",
+    "image_url": "/designs/img/var_3534_hue+180_1778699968013.png",
+    "filename": "var_3534_hue+180_1778699968013.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:19:30.36759+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3538,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#674632",
+    "saturation": 0.346,
+    "title": "Amber Atelier No.3538",
+    "handle": "wallco-3538",
+    "image_url": "/designs/img/var_3534_hue-60_1778699970373.png",
+    "filename": "var_3534_hue-60_1778699970373.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:19:32.531417+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3539,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#674632",
+    "saturation": 0.346,
+    "title": "Amber Salon No.3539",
+    "handle": "wallco-3539",
+    "image_url": "/designs/img/var_3534_mono_1778699972535.png",
+    "filename": "var_3534_mono_1778699972535.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:19:34.700696+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3540,
+    "kind": "seamless_tile",
+    "category": "butterfly-trellis",
+    "dominant_hex": "#f6f0e2",
+    "saturation": 0.526,
+    "title": "Honey Atelier No.3540",
+    "handle": "wallco-3540",
+    "image_url": "/designs/img/bt_cane_1778700004187_1014121141.png",
+    "filename": "bt_cane_1778700004187_1014121141.png",
+    "generator": "wallco.ai",
+    "seed": 1014121141,
+    "is_published": false,
+    "created_at": "2026-05-13T19:20:04.298669+00:00",
+    "motifs": [
+      "butterfly",
+      "cane",
+      "lattice"
+    ],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3541,
+    "kind": "seamless_tile",
+    "category": "drunk-animals",
+    "dominant_hex": "#1d2027",
+    "saturation": 0.147,
+    "title": "Sapphire Tipple No.3541",
+    "handle": "wallco-3541",
+    "image_url": "/designs/img/1778700001308_532018192.png",
+    "filename": "1778700001308_532018192.png",
+    "generator": "wallco.ai",
+    "seed": 532018192,
+    "is_published": false,
+    "created_at": "2026-05-13T19:20:13.537286+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3542,
+    "kind": "seamless_tile",
+    "category": "stoned-animals",
+    "dominant_hex": "#a6456a",
+    "saturation": 0.413,
+    "title": "Rose Stardust No.3542",
+    "handle": "wallco-3542",
+    "image_url": "/designs/img/1778700001468_1667581554.png",
+    "filename": "1778700001468_1667581554.png",
+    "generator": "wallco.ai",
+    "seed": 1667581554,
+    "is_published": false,
+    "created_at": "2026-05-13T19:20:14.719444+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3543,
+    "kind": "seamless_tile",
+    "category": "butterfly-trellis",
+    "dominant_hex": "#f6f0e1",
+    "saturation": 0.538,
+    "title": "Honey Folio No.3543",
+    "handle": "wallco-3543",
+    "image_url": "/designs/img/bt_cane_1778700014990_1453843725.png",
+    "filename": "bt_cane_1778700014990_1453843725.png",
+    "generator": "wallco.ai",
+    "seed": 1453843725,
+    "is_published": true,
+    "created_at": "2026-05-13T19:20:15.100319+00:00",
+    "motifs": [
+      "butterfly",
+      "cane",
+      "lattice"
+    ],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3544,
+    "kind": "seamless_tile",
+    "category": "butterfly-trellis",
+    "dominant_hex": "#50795f",
+    "saturation": 0.204,
+    "title": "Sage Reverie No.3544",
+    "handle": "wallco-3544",
+    "image_url": "/designs/img/bt_cane_1778700024991_284563203.png",
+    "filename": "bt_cane_1778700024991_284563203.png",
+    "generator": "wallco.ai",
+    "seed": 284563203,
+    "is_published": false,
+    "created_at": "2026-05-13T19:20:25.172959+00:00",
+    "motifs": [
+      "butterfly",
+      "cane",
+      "lattice"
+    ],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3545,
+    "kind": "seamless_tile",
+    "category": "drunk-animals",
+    "dominant_hex": "#2c7a86",
+    "saturation": 0.506,
+    "title": "Marine Vignette No.3545",
+    "handle": "wallco-3545",
+    "image_url": "/designs/img/1778700028001_1014338927.png",
+    "filename": "1778700028001_1014338927.png",
+    "generator": "wallco.ai",
+    "seed": 1014338927,
+    "is_published": false,
+    "created_at": "2026-05-13T19:20:39.823011+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3546,
+    "kind": "seamless_tile",
+    "category": "drunk-animals",
+    "dominant_hex": "#644f45",
+    "saturation": 0.183,
+    "title": "Amber Carouse No.3546",
+    "handle": "wallco-3546",
+    "image_url": "/designs/img/1778700091347_873734745.png",
+    "filename": "1778700091347_873734745.png",
+    "generator": "wallco.ai",
+    "seed": 873734745,
+    "is_published": false,
+    "created_at": "2026-05-13T19:21:39.509831+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3547,
+    "kind": "seamless_tile",
+    "category": "stoned-animals",
+    "dominant_hex": "#535f74",
+    "saturation": 0.166,
+    "title": "Sapphire Spore No.3547",
+    "handle": "wallco-3547",
+    "image_url": "/designs/img/1778700091463_254929323.png",
+    "filename": "1778700091463_254929323.png",
+    "generator": "wallco.ai",
+    "seed": 254929323,
+    "is_published": false,
+    "created_at": "2026-05-13T19:21:43.289429+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3549,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#30281f",
+    "saturation": 0.215,
+    "title": "Amber Salon No.3549",
+    "handle": "wallco-3549",
+    "image_url": "/designs/img/1778700144030_1022590462.png",
+    "filename": "1778700144030_1022590462.png",
+    "generator": "wallco.ai",
+    "seed": 1022590462,
+    "is_published": false,
+    "created_at": "2026-05-13T19:22:39.288101+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3551,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#30281f",
+    "saturation": 0.215,
+    "title": "Amber Damask No.3551",
+    "handle": "wallco-3551",
+    "image_url": "/designs/img/var_3549_hue+60_1778700159397.png",
+    "filename": "var_3549_hue+60_1778700159397.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:22:41.419325+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3552,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#30281f",
+    "saturation": 0.215,
+    "title": "Amber Heirloom No.3552",
+    "handle": "wallco-3552",
+    "image_url": "/designs/img/var_3549_hue+120_1778700161425.png",
+    "filename": "var_3549_hue+120_1778700161425.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:22:43.462504+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3553,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#30281f",
+    "saturation": 0.215,
+    "title": "Amber Atelier No.3553",
+    "handle": "wallco-3553",
+    "image_url": "/designs/img/var_3549_hue+180_1778700163469.png",
+    "filename": "var_3549_hue+180_1778700163469.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:22:45.516837+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3554,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#30281f",
+    "saturation": 0.215,
+    "title": "Amber Salon No.3554",
+    "handle": "wallco-3554",
+    "image_url": "/designs/img/var_3549_hue-60_1778700165522.png",
+    "filename": "var_3549_hue-60_1778700165522.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:22:47.571864+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3555,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#30281f",
+    "saturation": 0.215,
+    "title": "Amber Baroque No.3555",
+    "handle": "wallco-3555",
+    "image_url": "/designs/img/var_3549_mono_1778700167575.png",
+    "filename": "var_3549_mono_1778700167575.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:22:49.653668+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3558,
+    "kind": "seamless_tile",
+    "category": "drunk-animals",
+    "dominant_hex": "#643444",
+    "saturation": 0.316,
+    "title": "Rose Saunter No.3558",
+    "handle": "wallco-3558",
+    "image_url": "/designs/img/1778700181313_148781428.png",
+    "filename": "1778700181313_148781428.png",
+    "generator": "wallco.ai",
+    "seed": 148781428,
+    "is_published": false,
+    "created_at": "2026-05-13T19:23:09.532166+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3559,
+    "kind": "seamless_tile",
+    "category": "stoned-animals",
+    "dominant_hex": "#757356",
+    "saturation": 0.153,
+    "title": "Olive Halcyon No.3559",
+    "handle": "wallco-3559",
+    "image_url": "/designs/img/1778700181470_1984605314.png",
+    "filename": "1778700181470_1984605314.png",
+    "generator": "wallco.ai",
+    "seed": 1984605314,
+    "is_published": false,
+    "created_at": "2026-05-13T19:23:12.805323+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3560,
+    "kind": "seamless_tile",
+    "category": "drunk-animals",
+    "dominant_hex": "#e5a2ae",
+    "saturation": 0.563,
+    "title": "Rose Hiccup No.3560",
+    "handle": "wallco-3560",
+    "image_url": "/designs/img/1778700271318_922829407.png",
+    "filename": "1778700271318_922829407.png",
+    "generator": "wallco.ai",
+    "seed": 922829407,
+    "is_published": false,
+    "created_at": "2026-05-13T19:24:53.29994+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3561,
+    "kind": "seamless_tile",
+    "category": "stoned-animals",
+    "dominant_hex": "#372a28",
+    "saturation": 0.158,
+    "title": "Rose Trip No.3561",
+    "handle": "wallco-3561",
+    "image_url": "/designs/img/1778700271472_1205831484.png",
+    "filename": "1778700271472_1205831484.png",
+    "generator": "wallco.ai",
+    "seed": 1205831484,
+    "is_published": false,
+    "created_at": "2026-05-13T19:24:56.090457+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3562,
+    "kind": "seamless_tile",
+    "category": "drunk-animals",
+    "dominant_hex": "#8d6555",
+    "saturation": 0.248,
+    "title": "Amber Tableau No.3562",
+    "handle": "wallco-3562",
+    "image_url": "/designs/img/1778700280114_1420603111.png",
+    "filename": "1778700280114_1420603111.png",
+    "generator": "wallco.ai",
+    "seed": 1420603111,
+    "is_published": false,
+    "created_at": "2026-05-13T19:25:18.593621+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3563,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#141414",
+    "saturation": 0.0,
+    "title": "Noir Atelier No.3563",
+    "handle": "wallco-3563",
+    "image_url": "/designs/img/1778700339532_1212635790.png",
+    "filename": "1778700339532_1212635790.png",
+    "generator": "wallco.ai",
+    "seed": 1212635790,
+    "is_published": false,
+    "created_at": "2026-05-13T19:25:48.055865+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3564,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#141414",
+    "saturation": 0.0,
+    "title": "Noir Salon No.3564",
+    "handle": "wallco-3564",
+    "image_url": "/designs/img/var_3563_hue+60_1778700348162.png",
+    "filename": "var_3563_hue+60_1778700348162.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:25:50.349672+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3565,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#141414",
+    "saturation": 0.0,
+    "title": "Noir Baroque No.3565",
+    "handle": "wallco-3565",
+    "image_url": "/designs/img/var_3563_hue+120_1778700350354.png",
+    "filename": "var_3563_hue+120_1778700350354.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:25:52.542896+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3566,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#141414",
+    "saturation": 0.0,
+    "title": "Noir Damask No.3566",
+    "handle": "wallco-3566",
+    "image_url": "/designs/img/var_3563_hue+180_1778700352548.png",
+    "filename": "var_3563_hue+180_1778700352548.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:25:54.678275+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3567,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#141414",
+    "saturation": 0.0,
+    "title": "Noir Heirloom No.3567",
+    "handle": "wallco-3567",
+    "image_url": "/designs/img/var_3563_hue-60_1778700354683.png",
+    "filename": "var_3563_hue-60_1778700354683.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:25:56.921669+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3568,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#141414",
+    "saturation": 0.0,
+    "title": "Noir Atelier No.3568",
+    "handle": "wallco-3568",
+    "image_url": "/designs/img/var_3563_mono_1778700356927.png",
+    "filename": "var_3563_mono_1778700356927.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:25:59.150308+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3569,
+    "kind": "seamless_tile",
+    "category": "drunk-animals",
+    "dominant_hex": "#1d2d54",
+    "saturation": 0.487,
+    "title": "Sapphire Folly No.3569",
+    "handle": "wallco-3569",
+    "image_url": "/designs/img/1778700361318_341400129.png",
+    "filename": "1778700361318_341400129.png",
+    "generator": "wallco.ai",
+    "seed": 341400129,
+    "is_published": false,
+    "created_at": "2026-05-13T19:26:09.527336+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3570,
+    "kind": "seamless_tile",
+    "category": "stoned-animals",
+    "dominant_hex": "#8c925b",
+    "saturation": 0.232,
+    "title": "Olive Stealie No.3570",
+    "handle": "wallco-3570",
+    "image_url": "/designs/img/1778700361468_1957976497.png",
+    "filename": "1778700361468_1957976497.png",
+    "generator": "wallco.ai",
+    "seed": 1957976497,
+    "is_published": false,
+    "created_at": "2026-05-13T19:26:13.081017+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3571,
+    "kind": "seamless_tile",
+    "category": "colorways-imperial-garden-barone-facesup-test",
+    "dominant_hex": null,
+    "saturation": 0,
+    "title": "Slate Studio No.3571",
+    "handle": "wallco-3571",
+    "image_url": "/designs/img/dig1984_facesup_1778700440958_1199754521.png",
+    "filename": "dig1984_facesup_1778700440958_1199754521.png",
+    "generator": "wallco.ai",
+    "seed": 1199754521,
+    "is_published": false,
+    "created_at": "2026-05-13T19:27:20.988612+00:00",
+    "motifs": [
+      "floral",
+      "garden",
+      "chinoiserie"
+    ],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3572,
+    "kind": "seamless_tile",
+    "category": "colorways-imperial-garden-barone-facesup-test",
+    "dominant_hex": null,
+    "saturation": 0,
+    "title": "Slate Origin No.3572",
+    "handle": "wallco-3572",
+    "image_url": "/designs/img/dig1984_facesup_1778700449407_1399311402.png",
+    "filename": "dig1984_facesup_1778700449407_1399311402.png",
+    "generator": "wallco.ai",
+    "seed": 1399311402,
+    "is_published": false,
+    "created_at": "2026-05-13T19:27:29.436072+00:00",
+    "motifs": [
+      "floral",
+      "garden",
+      "chinoiserie"
+    ],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3573,
+    "kind": "seamless_tile",
+    "category": "stoned-animals",
+    "dominant_hex": "#5b5a49",
+    "saturation": 0.11,
+    "title": "Olive Daydream No.3573",
+    "handle": "wallco-3573",
+    "image_url": "/designs/img/1778700451471_497112921.png",
+    "filename": "1778700451471_497112921.png",
+    "generator": "wallco.ai",
+    "seed": 497112921,
+    "is_published": false,
+    "created_at": "2026-05-13T19:27:39.737957+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3574,
+    "kind": "seamless_tile",
+    "category": "drunk-animals",
+    "dominant_hex": "#42233a",
+    "saturation": 0.307,
+    "title": "Plum Soir\u00e9e No.3574",
+    "handle": "wallco-3574",
+    "image_url": "/designs/img/1778700451329_647008514.png",
+    "filename": "1778700451329_647008514.png",
+    "generator": "wallco.ai",
+    "seed": 647008514,
+    "is_published": false,
+    "created_at": "2026-05-13T19:27:40.060931+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3575,
+    "kind": "seamless_tile",
+    "category": "colorways-imperial-garden-barone-facesup-test",
+    "dominant_hex": null,
+    "saturation": 0,
+    "title": "Slate Atelier No.3575",
+    "handle": "wallco-3575",
+    "image_url": "/designs/img/dig1984_facesup_1778700460335_958893075.png",
+    "filename": "dig1984_facesup_1778700460335_958893075.png",
+    "generator": "wallco.ai",
+    "seed": 958893075,
+    "is_published": false,
+    "created_at": "2026-05-13T19:27:40.36533+00:00",
+    "motifs": [
+      "floral",
+      "garden",
+      "chinoiserie"
+    ],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3576,
+    "kind": "seamless_tile",
+    "category": "colorways-imperial-garden-barone-facesup-test",
+    "dominant_hex": null,
+    "saturation": 0,
+    "title": "Slate Studio No.3576",
+    "handle": "wallco-3576",
+    "image_url": "/designs/img/dig1984_facesup_1778700467991_1703951418.png",
+    "filename": "dig1984_facesup_1778700467991_1703951418.png",
+    "generator": "wallco.ai",
+    "seed": 1703951418,
+    "is_published": false,
+    "created_at": "2026-05-13T19:27:48.015298+00:00",
+    "motifs": [
+      "floral",
+      "garden",
+      "chinoiserie"
+    ],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3577,
+    "kind": "seamless_tile",
+    "category": "colorways-imperial-garden-barone-facesup-test",
+    "dominant_hex": null,
+    "saturation": 0,
+    "title": "Slate Origin No.3577",
+    "handle": "wallco-3577",
+    "image_url": "/designs/img/dig1984_facesup_1778700479366_1326569293.png",
+    "filename": "dig1984_facesup_1778700479366_1326569293.png",
+    "generator": "wallco.ai",
+    "seed": 1326569293,
+    "is_published": false,
+    "created_at": "2026-05-13T19:27:59.388607+00:00",
+    "motifs": [
+      "floral",
+      "garden",
+      "chinoiserie"
+    ],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3578,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#6b5232",
+    "saturation": 0.363,
+    "title": "Amber Atelier No.3578",
+    "handle": "wallco-3578",
+    "image_url": "/designs/img/1778700528283_1731867545.png",
+    "filename": "1778700528283_1731867545.png",
+    "generator": "wallco.ai",
+    "seed": 1731867545,
+    "is_published": false,
+    "created_at": "2026-05-13T19:28:56.507566+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3579,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#6b5232",
+    "saturation": 0.363,
+    "title": "Amber Salon No.3579",
+    "handle": "wallco-3579",
+    "image_url": "/designs/img/var_3578_hue+60_1778700536621.png",
+    "filename": "var_3578_hue+60_1778700536621.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:28:58.74722+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3580,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#6b5232",
+    "saturation": 0.363,
+    "title": "Amber Baroque No.3580",
+    "handle": "wallco-3580",
+    "image_url": "/designs/img/var_3578_hue+120_1778700538751.png",
+    "filename": "var_3578_hue+120_1778700538751.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:29:00.793238+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3581,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#6b5232",
+    "saturation": 0.363,
+    "title": "Amber Damask No.3581",
+    "handle": "wallco-3581",
+    "image_url": "/designs/img/var_3578_hue+180_1778700540796.png",
+    "filename": "var_3578_hue+180_1778700540796.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:29:02.931625+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3582,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#6b5232",
+    "saturation": 0.363,
+    "title": "Amber Heirloom No.3582",
+    "handle": "wallco-3582",
+    "image_url": "/designs/img/var_3578_hue-60_1778700542935.png",
+    "filename": "var_3578_hue-60_1778700542935.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:29:05.042761+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3583,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#6b5232",
+    "saturation": 0.363,
+    "title": "Amber Atelier No.3583",
+    "handle": "wallco-3583",
+    "image_url": "/designs/img/var_3578_mono_1778700545046.png",
+    "filename": "var_3578_mono_1778700545046.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:29:07.22574+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3584,
+    "kind": "seamless_tile",
+    "category": "stoned-animals",
+    "dominant_hex": "#8d5b4a",
+    "saturation": 0.312,
+    "title": "Amber Vespers No.3584",
+    "handle": "wallco-3584",
+    "image_url": "/designs/img/1778700541474_1873616546.png",
+    "filename": "1778700541474_1873616546.png",
+    "generator": "wallco.ai",
+    "seed": 1873616546,
+    "is_published": false,
+    "created_at": "2026-05-13T19:29:10.101359+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3585,
+    "kind": "seamless_tile",
+    "category": "drunk-animals",
+    "dominant_hex": "#b752a2",
+    "saturation": 0.412,
+    "title": "Plum Vignette No.3585",
+    "handle": "wallco-3585",
+    "image_url": "/designs/img/1778700541302_1751332295.png",
+    "filename": "1778700541302_1751332295.png",
+    "generator": "wallco.ai",
+    "seed": 1751332295,
+    "is_published": false,
+    "created_at": "2026-05-13T19:29:10.292087+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3586,
+    "kind": "seamless_tile",
+    "category": "drunk-animals",
+    "dominant_hex": "#4c2c4d",
+    "saturation": 0.273,
+    "title": "Plum Carouse No.3586",
+    "handle": "wallco-3586",
+    "image_url": "/designs/img/1778700558874_840736930.png",
+    "filename": "1778700558874_840736930.png",
+    "generator": "wallco.ai",
+    "seed": 840736930,
+    "is_published": false,
+    "created_at": "2026-05-13T19:29:27.562709+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3587,
+    "kind": "seamless_tile",
+    "category": "drunk-animals",
+    "dominant_hex": "#ba334e",
+    "saturation": 0.57,
+    "title": "Rose Caprice No.3587",
+    "handle": "wallco-3587",
+    "image_url": "/designs/img/1778700631339_1767398205.png",
+    "filename": "1778700631339_1767398205.png",
+    "generator": "wallco.ai",
+    "seed": 1767398205,
+    "is_published": false,
+    "created_at": "2026-05-13T19:30:40.103444+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3588,
+    "kind": "seamless_tile",
+    "category": "stoned-animals",
+    "dominant_hex": "#80804c",
+    "saturation": 0.255,
+    "title": "Olive Lullaby No.3588",
+    "handle": "wallco-3588",
+    "image_url": "/designs/img/1778700631474_1748721754.png",
+    "filename": "1778700631474_1748721754.png",
+    "generator": "wallco.ai",
+    "seed": 1748721754,
+    "is_published": false,
+    "created_at": "2026-05-13T19:30:40.357259+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3589,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#1b4648",
+    "saturation": 0.455,
+    "title": "Marine Salon No.3589",
+    "handle": "wallco-3589",
+    "image_url": "/designs/img/1778700718838_1339577984.png",
+    "filename": "1778700718838_1339577984.png",
+    "generator": "wallco.ai",
+    "seed": 1339577984,
+    "is_published": false,
+    "created_at": "2026-05-13T19:32:08.315703+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3590,
+    "kind": "seamless_tile",
+    "category": "drunk-animals",
+    "dominant_hex": "#566548",
+    "saturation": 0.168,
+    "title": "Sage Hiccup No.3590",
+    "handle": "wallco-3590",
+    "image_url": "/designs/img/1778700721428_2048374189.png",
+    "filename": "1778700721428_2048374189.png",
+    "generator": "wallco.ai",
+    "seed": 2048374189,
+    "is_published": false,
+    "created_at": "2026-05-13T19:32:10.050354+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3591,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#1b4648",
+    "saturation": 0.455,
+    "title": "Marine Damask No.3591",
+    "handle": "wallco-3591",
+    "image_url": "/designs/img/var_3589_hue+60_1778700728478.png",
+    "filename": "var_3589_hue+60_1778700728478.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:32:11.211227+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3592,
+    "kind": "seamless_tile",
+    "category": "stoned-animals",
+    "dominant_hex": "#38847f",
+    "saturation": 0.404,
+    "title": "Marine Stardust No.3592",
+    "handle": "wallco-3592",
+    "image_url": "/designs/img/1778700721539_812906326.png",
+    "filename": "1778700721539_812906326.png",
+    "generator": "wallco.ai",
+    "seed": 812906326,
+    "is_published": false,
+    "created_at": "2026-05-13T19:32:14.517147+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3593,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#1b4648",
+    "saturation": 0.455,
+    "title": "Marine Atelier No.3593",
+    "handle": "wallco-3593",
+    "image_url": "/designs/img/var_3589_hue+120_1778700731216.png",
+    "filename": "var_3589_hue+120_1778700731216.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:32:14.519168+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3594,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#1b4648",
+    "saturation": 0.455,
+    "title": "Marine Salon No.3594",
+    "handle": "wallco-3594",
+    "image_url": "/designs/img/var_3589_hue+180_1778700734522.png",
+    "filename": "var_3589_hue+180_1778700734522.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:32:17.141078+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3595,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#1b4648",
+    "saturation": 0.455,
+    "title": "Marine Baroque No.3595",
+    "handle": "wallco-3595",
+    "image_url": "/designs/img/var_3589_hue-60_1778700737145.png",
+    "filename": "var_3589_hue-60_1778700737145.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:32:20.267831+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3596,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#1b4648",
+    "saturation": 0.455,
+    "title": "Marine Damask No.3596",
+    "handle": "wallco-3596",
+    "image_url": "/designs/img/var_3589_mono_1778700740276.png",
+    "filename": "var_3589_mono_1778700740276.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:32:23.009418+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3597,
+    "kind": "seamless_tile",
+    "category": "drunk-animals",
+    "dominant_hex": "#4d4839",
+    "saturation": 0.149,
+    "title": "Honey Caprice No.3597",
+    "handle": "wallco-3597",
+    "image_url": "/designs/img/1778700807861_1535678782.png",
+    "filename": "1778700807861_1535678782.png",
+    "generator": "wallco.ai",
+    "seed": 1535678782,
+    "is_published": false,
+    "created_at": "2026-05-13T19:33:38.349304+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3598,
+    "kind": "seamless_tile",
+    "category": "drunk-animals",
+    "dominant_hex": "#ac1d54",
+    "saturation": 0.711,
+    "title": "Rose Saunter No.3598",
+    "handle": "wallco-3598",
+    "image_url": "/designs/img/1778700811325_557138834.png",
+    "filename": "1778700811325_557138834.png",
+    "generator": "wallco.ai",
+    "seed": 557138834,
+    "is_published": false,
+    "created_at": "2026-05-13T19:33:39.562957+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3599,
+    "kind": "seamless_tile",
+    "category": "stoned-animals",
+    "dominant_hex": "#c64025",
+    "saturation": 0.685,
+    "title": "Rose Halcyon No.3599",
+    "handle": "wallco-3599",
+    "image_url": "/designs/img/1778700811479_219466307.png",
+    "filename": "1778700811479_219466307.png",
+    "generator": "wallco.ai",
+    "seed": 219466307,
+    "is_published": false,
+    "created_at": "2026-05-13T19:33:43.589084+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3600,
+    "kind": "seamless_tile",
+    "category": "drunk-animals",
+    "dominant_hex": "#161920",
+    "saturation": 0.185,
+    "title": "Sapphire Hiccup No.3600",
+    "handle": "wallco-3600",
+    "image_url": "/designs/img/1778700901318_463720931.png",
+    "filename": "1778700901318_463720931.png",
+    "generator": "wallco.ai",
+    "seed": 463720931,
+    "is_published": false,
+    "created_at": "2026-05-13T19:35:09.894306+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3601,
+    "kind": "seamless_tile",
+    "category": "stoned-animals",
+    "dominant_hex": "#738060",
+    "saturation": 0.143,
+    "title": "Sage Trip No.3601",
+    "handle": "wallco-3601",
+    "image_url": "/designs/img/1778700901487_1019634419.png",
+    "filename": "1778700901487_1019634419.png",
+    "generator": "wallco.ai",
+    "seed": 1019634419,
+    "is_published": false,
+    "created_at": "2026-05-13T19:35:13.050241+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3602,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#67683e",
+    "saturation": 0.253,
+    "title": "Olive Heirloom No.3602",
+    "handle": "wallco-3602",
+    "image_url": "/designs/img/1778700908599_2120529321.png",
+    "filename": "1778700908599_2120529321.png",
+    "generator": "wallco.ai",
+    "seed": 2120529321,
+    "is_published": false,
+    "created_at": "2026-05-13T19:35:16.871503+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3603,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#67683e",
+    "saturation": 0.253,
+    "title": "Olive Atelier No.3603",
+    "handle": "wallco-3603",
+    "image_url": "/designs/img/var_3602_hue+60_1778700916976.png",
+    "filename": "var_3602_hue+60_1778700916976.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:35:19.095986+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3604,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#67683e",
+    "saturation": 0.253,
+    "title": "Olive Salon No.3604",
+    "handle": "wallco-3604",
+    "image_url": "/designs/img/var_3602_hue+120_1778700919101.png",
+    "filename": "var_3602_hue+120_1778700919101.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:35:21.170019+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3605,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#67683e",
+    "saturation": 0.253,
+    "title": "Olive Baroque No.3605",
+    "handle": "wallco-3605",
+    "image_url": "/designs/img/var_3602_hue+180_1778700921175.png",
+    "filename": "var_3602_hue+180_1778700921175.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:35:23.94243+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3606,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#67683e",
+    "saturation": 0.253,
+    "title": "Olive Damask No.3606",
+    "handle": "wallco-3606",
+    "image_url": "/designs/img/var_3602_hue-60_1778700923946.png",
+    "filename": "var_3602_hue-60_1778700923946.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:35:29.193634+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3607,
+    "kind": "seamless_tile",
+    "category": "damask",
+    "dominant_hex": "#67683e",
+    "saturation": 0.253,
+    "title": "Olive Heirloom No.3607",
+    "handle": "wallco-3607",
+    "image_url": "/designs/img/var_3602_mono_1778700929201.png",
+    "filename": "var_3602_mono_1778700929201.png",
+    "generator": "wallco.ai",
+    "seed": 0,
+    "is_published": false,
+    "created_at": "2026-05-13T19:35:33.176643+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3608,
+    "kind": "seamless_tile",
+    "category": "drunk-animals",
+    "dominant_hex": "#7e633d",
+    "saturation": 0.348,
+    "title": "Honey Saunter No.3608",
+    "handle": "wallco-3608",
+    "image_url": "/designs/img/1778700991366_1586767071.png",
+    "filename": "1778700991366_1586767071.png",
+    "generator": "wallco.ai",
+    "seed": 1586767071,
+    "is_published": false,
+    "created_at": "2026-05-13T19:36:39.640548+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3609,
+    "kind": "seamless_tile",
+    "category": "stoned-animals",
+    "dominant_hex": "#2e373e",
+    "saturation": 0.148,
+    "title": "Sapphire Halcyon No.3609",
+    "handle": "wallco-3609",
+    "image_url": "/designs/img/1778700991505_886011304.png",
+    "filename": "1778700991505_886011304.png",
+    "generator": "wallco.ai",
+    "seed": 886011304,
+    "is_published": false,
+    "created_at": "2026-05-13T19:36:43.295867+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3610,
+    "kind": "seamless_tile",
+    "category": "drunk-animals",
+    "dominant_hex": "#bf3683",
+    "saturation": 0.559,
+    "title": "Plum Hiccup No.3610",
+    "handle": "wallco-3610",
+    "image_url": "/designs/img/1778701058676_317565491.png",
+    "filename": "1778701058676_317565491.png",
+    "generator": "wallco.ai",
+    "seed": 317565491,
+    "is_published": false,
+    "created_at": "2026-05-13T19:37:51.716003+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3611,
+    "kind": "seamless_tile",
+    "category": "drunk-animals",
+    "dominant_hex": "#76336a",
+    "saturation": 0.396,
+    "title": "Plum Tipple No.3611",
+    "handle": "wallco-3611",
+    "image_url": "/designs/img/1778701081330_1037289097.png",
+    "filename": "1778701081330_1037289097.png",
+    "generator": "wallco.ai",
+    "seed": 1037289097,
+    "is_published": false,
+    "created_at": "2026-05-13T19:38:09.991506+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
+  },
+  {
+    "id": 3612,
+    "kind": "seamless_tile",
+    "category": "stoned-animals",
+    "dominant_hex": "#95475d",
+    "saturation": 0.355,
+    "title": "Rose Stardust No.3612",
+    "handle": "wallco-3612",
+    "image_url": "/designs/img/1778701081494_533280825.png",
+    "filename": "1778701081494_533280825.png",
+    "generator": "wallco.ai",
+    "seed": 533280825,
+    "is_published": false,
+    "created_at": "2026-05-13T19:38:13.149894+00:00",
+    "motifs": [],
+    "user_removed": false,
+    "user_color_good": null,
+    "user_style_good": null,
+    "user_scale_good": null,
+    "user_stars": null,
+    "room_mockups": []
   }
 ]
\ No newline at end of file
diff --git a/scripts/dig1984_facesup_master_preprocess.js b/scripts/dig1984_facesup_master_preprocess.js
new file mode 100644
index 0000000..6e6cdef
--- /dev/null
+++ b/scripts/dig1984_facesup_master_preprocess.js
@@ -0,0 +1,85 @@
+#!/usr/bin/env node
+/**
+ * Option A: pre-process DIG-1984 into a "FacesUp Master" — one Gemini call
+ * to RE-ORIENT every leaf to face upward while preserving the chinoiserie
+ * composition, butterflies, and flowers. If Gemini honors the recompose
+ * here, the resulting master image becomes the source for the 100-colorway
+ * batch (each downstream recolor inherits the directional fix).
+ *
+ * Output: /tmp/wallco-sources/DIG-1984-facesup-master.png
+ * Cost: ~$0.001 (1 image)
+ *
+ * Run: cd ~/Projects/wallco-ai && node scripts/dig1984_facesup_master_preprocess.js
+ */
+'use strict';
+require('dotenv').config({ path: require('path').join(__dirname, '..', '.env') });
+const fs = require('fs');
+const path = require('path');
+
+const KEY = process.env.GEMINI_API_KEY;
+if (!KEY) { console.error('GEMINI_API_KEY missing'); process.exit(1); }
+const SRC = '/tmp/wallco-sources/DIG-1984.jpg';
+const OUT = '/tmp/wallco-sources/DIG-1984-facesup-master.png';
+if (!fs.existsSync(SRC)) { console.error(`source missing: ${SRC}`); process.exit(1); }
+
+const SRC_B64 = fs.readFileSync(SRC).toString('base64');
+
+const PROMPT = [
+  'TASK: Re-orient the foliage in this chinoiserie wallpaper pattern.',
+  '',
+  'KEEP IDENTICAL:',
+  '- The overall composition, vine paths, and pattern scale.',
+  '- Every butterfly: same positions, same colors, same shapes.',
+  '- Every flower: same positions, same colors, same shapes.',
+  '- The white/cream background.',
+  '- The branch and vine networks.',
+  '',
+  'CHANGE (the only change):',
+  '- ROTATE every individual leaf so its tip points UPWARD toward the top of the tile.',
+  '- This applies to EVERY leaf — large leaves, small leaves, accent leaves.',
+  '- A leaf that currently points sideways or downward must be rotated in place to point UP.',
+  '- The leaf STEM stays attached to its vine; only the leaf BLADE rotates around the stem.',
+  '- Single directional axis. NO leaves sideways. NO leaves downward.',
+  '',
+  'COMPLIANCE CHECK: when you are done, every leaf in the output must have its tip pointing toward the top of the image. If you cannot fully comply with this rule, redraw the leaves rather than leaving them mis-oriented.',
+  '',
+  'Output is a seamless wallpaper tile, archival quality, no signature, no watermark, no text.',
+].join('\n');
+
+(async () => {
+  console.log('Pre-processing DIG-1984 into FacesUp master…');
+  const body = {
+    contents: [{
+      parts: [
+        { inline_data: { mime_type: 'image/jpeg', data: SRC_B64 } },
+        { text: PROMPT }
+      ]
+    }],
+    generationConfig: { responseModalities: ['IMAGE'] }
+  };
+  const url = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-image:generateContent?key=${KEY}`;
+  const t0 = Date.now();
+  const r = await fetch(url, {
+    method: 'POST',
+    headers: { 'Content-Type': 'application/json' },
+    body: JSON.stringify(body),
+  });
+  if (!r.ok) { console.error(`HTTP ${r.status}: ${(await r.text()).slice(0, 400)}`); process.exit(1); }
+  const j = await r.json();
+  try {
+    const { logGemini } = require(require('os').homedir() + '/.claude/skills/cost-tracker/scripts/log-gemini.js');
+    logGemini(j, { app: 'wallco-ai', note: 'dig-1984-facesup-master-preprocess', model: 'gemini-2.5-flash-image' });
+  } catch {}
+  const part = j.candidates?.[0]?.content?.parts?.find(p => p.inline_data || p.inlineData);
+  const data = part?.inline_data?.data || part?.inlineData?.data;
+  if (!data) {
+    const text = j.candidates?.[0]?.content?.parts?.find(p => p.text)?.text;
+    console.error(`no image returned (${j.candidates?.[0]?.finishReason || 'unknown'}): ${(text || '').slice(0, 400)}`);
+    process.exit(1);
+  }
+  fs.writeFileSync(OUT, Buffer.from(data, 'base64'));
+  const elapsed = ((Date.now() - t0) / 1000).toFixed(1);
+  console.log(`\n✓ ${OUT}  (${elapsed}s, ${(fs.statSync(OUT).size / 1024).toFixed(0)} KB)`);
+  console.log(`\nOpen for eyeball:  open '${OUT}'`);
+  console.log(`If every leaf now faces UP, this is the new canonical source for the 100-colorway batch.`);
+})();
diff --git a/scripts/dig1984_facesup_smoke_test.js b/scripts/dig1984_facesup_smoke_test.js
new file mode 100644
index 0000000..bbe87a1
--- /dev/null
+++ b/scripts/dig1984_facesup_smoke_test.js
@@ -0,0 +1,133 @@
+#!/usr/bin/env node
+/**
+ * 5-variant settlement-clearance smoke test for DIG-1984 Imperial Garden.
+ *
+ * Adds the HARD directional constraint "every leaf must face UP" to defeat
+ * Part A1 (directional variation) of the DW Settlement gate. Recolors the
+ * same source image; Gemini 2.5-flash-image-edit may or may not honor the
+ * recompose ask — Steve eyeballs the 5 outputs to decide whether to scale.
+ *
+ * Outputs go to is_published=FALSE so they don't surface on /designs.
+ * Five variants chosen for spread:
+ *   1. tone-on-tone green   (Whisper Sage)
+ *   2. tone-on-tone dark    (Navy Ghosted)
+ *   3. heritage botanical   (Emerald on Bone)
+ *   4. busy jewel-tone      (Sapphire & Emerald)
+ *   5. extreme high contrast (Black on White ink)
+ *
+ * Cost: 5 × ~$0.001 = ~$0.005. Run:
+ *   cd ~/Projects/wallco-ai && node scripts/dig1984_facesup_smoke_test.js
+ */
+'use strict';
+require('dotenv').config({ path: require('path').join(__dirname, '..', '.env') });
+const fs = require('fs');
+const path = require('path');
+const crypto = require('crypto');
+const { execSync, spawnSync } = require('child_process');
+
+const KEY = process.env.GEMINI_API_KEY;
+if (!KEY) { console.error('GEMINI_API_KEY missing'); process.exit(1); }
+const SRC = '/tmp/wallco-sources/DIG-1984.jpg';
+if (!fs.existsSync(SRC)) { console.error(`source missing: ${SRC}`); process.exit(1); }
+const SRC_B64 = fs.readFileSync(SRC).toString('base64');
+const OUT_DIR = path.join(__dirname, '..', 'data', 'generated');
+fs.mkdirSync(OUT_DIR, { recursive: true });
+
+const DB = process.env.WALLCO_DB || 'dw_unified';
+const PSQL = (process.platform === 'linux')
+  ? `sudo -n -u postgres psql ${DB} -At -q`
+  : `psql ${DB} -At -q`;
+function psql(sql) { return execSync(PSQL, { input: sql, encoding: 'utf8' }).trim(); }
+function esc(v) { if (v == null) return 'NULL'; return "'" + String(v).replace(/'/g, "''") + "'"; }
+
+const TESTS = [
+  { name: 'Whisper Sage (FacesUp)',          prompt: 'Recolor everything into the SAGE GREEN family ONLY. The ground becomes pale sage; the pattern motif becomes a slightly darker, more saturated sage with subtle gray-green undertones. No other hues anywhere. Tone-on-tone wallpaper feel.' },
+  { name: 'Navy Ghosted (FacesUp)',          prompt: 'Recolor into the NAVY family ONLY. Deep navy ground; near-black navy motif with subtle indigo. Mono-hue tonal.' },
+  { name: 'Heritage Emerald on Bone (FacesUp)', prompt: 'Bone-ivory ground; recolor the entire pattern motif to deep emerald green. Archival watercolor feel.' },
+  { name: 'Jewel Sapphire & Emerald (FacesUp)', prompt: 'Deep midnight ground; recolor motif in sapphire blue + emerald green + amethyst purple jewel tones with subtle metallic shimmer.' },
+  { name: 'Ink Black on White (FacesUp)',    prompt: 'Pure white ground; recolor the entire motif to pure black ink linework, no other colors. Pen-and-ink feel.' },
+];
+
+const FACES_UP = [
+  'CRITICAL DIRECTIONAL CONSTRAINT: rotate every leaf, vine tip, frond, and stem so ALL foliage points UPWARD toward the top of the tile.',
+  'No leaves rotated sideways. No leaves rotated downward. Single directional axis only.',
+  'This directional uniformity is a HARD constraint — more important than preserving original leaf orientations.',
+  'Flowers and butterflies keep their existing positions and palette logic; only the FOLIAGE re-orients to face up.',
+].join(' ');
+
+const SHARED_TAIL = [
+  'Preserve overall pattern composition and motif placement.',
+  'Seamless tile, no edge artifacts, no signature, no watermark, no text.',
+  'High detail, archival quality, fabric-pattern aesthetic, no cartoon style.',
+].join(' ');
+
+async function generateOne(v, idx) {
+  const fullPrompt = v.prompt + ' ' + FACES_UP + ' ' + SHARED_TAIL;
+  const body = {
+    contents: [{
+      parts: [
+        { inline_data: { mime_type: 'image/jpeg', data: SRC_B64 } },
+        { text: fullPrompt }
+      ]
+    }],
+    generationConfig: { responseModalities: ['IMAGE'] }
+  };
+  const url = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-image:generateContent?key=${KEY}`;
+  const t0 = Date.now();
+  const r = await fetch(url, {
+    method: 'POST',
+    headers: { 'Content-Type': 'application/json' },
+    body: JSON.stringify(body),
+  });
+  if (!r.ok) throw new Error(`HTTP ${r.status}: ${(await r.text()).slice(0, 300)}`);
+  const j = await r.json();
+  try {
+    const { logGemini } = require(require('os').homedir() + '/.claude/skills/cost-tracker/scripts/log-gemini.js');
+    logGemini(j, { app: 'wallco-ai', note: 'dig-1984-facesup-smoke', model: 'gemini-2.5-flash-image' });
+  } catch {}
+  const part = j.candidates?.[0]?.content?.parts?.find(p => p.inline_data || p.inlineData);
+  const data = part?.inline_data?.data || part?.inlineData?.data;
+  if (!data) {
+    const text = j.candidates?.[0]?.content?.parts?.find(p => p.text)?.text;
+    throw new Error(`no image returned (${j.candidates?.[0]?.finishReason || 'unknown'}): ${(text || '').slice(0, 200)}`);
+  }
+  const seed = crypto.randomInt(1, 2 ** 31 - 1);
+  const filename = `dig1984_facesup_${Date.now()}_${seed}.png`;
+  const outPath = path.join(OUT_DIR, filename);
+  fs.writeFileSync(outPath, Buffer.from(data, 'base64'));
+  const elapsed = ((Date.now() - t0) / 1000).toFixed(1);
+
+  const labelTitle = `Imperial Garden Barone · ${v.name}`;
+  const promptDesc = (labelTitle + ' — ' + v.prompt + ' [FacesUp constraint applied]').slice(0, 1800);
+  const insertSql = `INSERT INTO spoon_all_designs
+    (kind, width_in, height_in, generator, prompt, seed, dominant_hex, palette,
+     local_path, image_url, category, motifs, tags, is_published, request_text)
+    VALUES ('seamless_tile', 24, 24, 'gemini-2.5-flash-image-edit',
+      ${esc(promptDesc)}, ${seed},
+      NULL, '[]'::jsonb,
+      ${esc(outPath)}, ${esc('/designs/img/' + filename)},
+      'colorways-imperial-garden-barone-facesup-test',
+      ARRAY['floral', 'garden', 'chinoiserie']::text[],
+      ARRAY['imperial-garden', 'barone', 'dig-1984', 'facesup-smoke-test', 'settlement-mitigation']::text[],
+      FALSE, ${esc('dig-1984 FacesUp smoke #' + (idx + 1) + ': ' + v.name)})
+    RETURNING id;`;
+  const id = parseInt(psql(insertSql), 10);
+  console.log(`  [${idx + 1}/5] ${v.name.padEnd(38)} → id=${id}  ${elapsed}s  ${filename}`);
+  return { id, name: v.name, outPath };
+}
+
+(async () => {
+  console.log(`\nDIG-1984 FacesUp settlement-clearance smoke test (5 variants)\n`);
+  const results = [];
+  for (let i = 0; i < TESTS.length; i++) {
+    try { results.push(await generateOne(TESTS[i], i)); }
+    catch (e) { console.error(`  [${i + 1}/5] FAIL — ${e.message.slice(0, 200)}`); }
+  }
+  console.log(`\nDone. ${results.length}/5 generated.`);
+  if (results.length) {
+    console.log(`\nLocal paths to open:`);
+    for (const r of results) console.log(`  open '${r.outPath}'`);
+    console.log(`\nAll quarantined (is_published=false). Open each in Preview to eyeball whether Gemini honored the 'leaves face up' directional constraint.`);
+  }
+  process.exit(results.length === 5 ? 0 : 1);
+})();
diff --git a/server.js b/server.js
index 213957d..3662dac 100644
--- a/server.js
+++ b/server.js
@@ -464,9 +464,12 @@ app.get('/api/designs/random', (req, res) => {
   const n = Math.max(1, Math.min(50, parseInt(req.query.n || '12', 10)));
   const category = String(req.query.category || '').toLowerCase().trim();
   const seedRaw = req.query.seed;
+  // Hard filter — same as /api/designs. Never feed Hot-or-not or random
+  // grids a design whose image file isn't on disk. Steve's rule 2026-05-13.
+  const onDisk = DESIGNS.filter(designHasImage);
   const pool = category
-    ? DESIGNS.filter(d => (d.category || '').toLowerCase() === category)
-    : DESIGNS.slice();
+    ? onDisk.filter(d => (d.category || '').toLowerCase() === category)
+    : onDisk.slice();
   // Deterministic seeded PRNG (mulberry32) if seed provided; else Math.random.
   let rand;
   if (seedRaw !== undefined && seedRaw !== '') {
@@ -8778,6 +8781,36 @@ app.post('/api/leads', async (req, res) => {
 });
 
 // ── API: designs JSON (for future use / inline editor)
+// File-existence cache — built once at module load, refreshed every 5min.
+// Filters out designs whose PNG isn't on disk so the grid never shows blank
+// tiles. Steve's standing rule (2026-05-13): "hot or not — anything cannot
+// show unless there is a photo or pic". Same rule applies to /designs.
+let _imgExistsCache = null;
+let _imgExistsRefreshedAt = 0;
+function imageFilesOnDisk() {
+  const now = Date.now();
+  if (_imgExistsCache && (now - _imgExistsRefreshedAt) < 5 * 60 * 1000) return _imgExistsCache;
+  try {
+    const files = fs.readdirSync(IMG_DIR);
+    _imgExistsCache = new Set(files);
+    _imgExistsRefreshedAt = now;
+    console.log(`[api/designs] file-cache refreshed: ${files.length} files on disk`);
+  } catch (e) {
+    console.error('[api/designs] readdir fail:', e.message);
+    if (!_imgExistsCache) _imgExistsCache = new Set();
+  }
+  return _imgExistsCache;
+}
+function designHasImage(d) {
+  if (!d) return false;
+  const fileSet = imageFilesOnDisk();
+  if (d.filename) return fileSet.has(d.filename);
+  if (d.image_url && d.image_url.startsWith('/designs/img/')) {
+    return fileSet.has(d.image_url.replace('/designs/img/', ''));
+  }
+  return false;
+}
+
 app.get('/api/designs', (req, res) => {
   const sort = req.query.sort || 'newest';
   const cat  = req.query.cat  || '';
@@ -8785,7 +8818,8 @@ app.get('/api/designs', (req, res) => {
   const page = Math.max(1, parseInt(req.query.page || '1', 10));
   const PER  = parseInt(req.query.limit || '60', 10);
 
-  let filtered = [...DESIGNS];
+  // Hard filter — never serve a row whose image file isn't on disk.
+  let filtered = DESIGNS.filter(designHasImage);
   if (cat)  filtered = filtered.filter(d => d.category === cat);
   if (q)    filtered = filtered.filter(d =>
     d.title.toLowerCase().includes(q) || d.category.includes(q)

← 5fee57a wallco.ai: wall-fit crop tool on /design/:id (W×H input, til  ·  back to Wallco Ai  ·  wallco-ai: gate Rate panel on admin, restore See-in-Room gen e5bfcad →