← 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
M data/designs.jsonA scripts/dig1984_facesup_master_preprocess.jsA scripts/dig1984_facesup_smoke_test.jsM server.js
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 →