← back to Fentucci Naturals
add download-images, color-names (PIL hue buckets), stage-db (tokiwa_catalog), image-audit scripts
bd416c6bc042b9b41f14718ee9f3d65aad9e08b9 · 2026-07-22 17:40:02 -0700 · Steve Abrams
Files touched
A images/005-801-003-301.jpgA images/005-801-003-305.jpgA images/005-801-003-307.jpgA images/005-801-003-308.jpgA images/005-801-003-310.jpgA images/005-802-003-301.jpgA images/005-802-003-305.jpgA images/005-802-003-307.jpgA images/005-802-003-308.jpgA images/005-802-003-310.jpgA images/005-803-003-301.jpgA images/005-803-003-305.jpgA images/005-803-003-307.jpgA images/005-803-003-308.jpgA images/005-804-003-301.jpgA images/005-804-003-305.jpgA images/005-804-003-307.jpgA images/005-804-003-308.jpgA images/005-804-003-310.jpgA images/005-805-003-301.jpgA images/005-805-003-305.jpgA images/005-805-003-307.jpgA images/005-805-003-308.jpgA images/005-805-003-310.jpgA images/0509.jpgA images/0510.jpgA images/0511.jpgA images/0512.jpgA images/0513.jpgA images/0514.jpgA images/0709.jpgA images/0710.jpgA images/0711.jpgA images/0712.jpgA images/0713.jpgA images/1201.jpgA images/1202.jpgA images/1203.jpgA images/1204.jpgA images/1205.jpgA images/1206.jpgA images/1207.jpgA images/1208.jpgA images/1301.jpgA images/1302.jpgA images/1303.jpgA images/1304.jpgA images/1305.jpgA images/1306.jpgA images/1401.jpgA images/1402.jpgA images/1403.jpgA images/1405.jpgA images/1406.jpgA images/1501.jpgA images/1502.jpgA images/1503.jpgA images/1504.jpgA images/A-18001.jpgA images/A-18002.jpgA images/A-18003.jpgA images/A-18004.jpgA images/A-18005.jpgA images/A-18006.jpgA images/A-18007.jpgA images/A-18008.jpgA images/A-18009.jpgA images/A-18010.jpgA images/A-2550.jpgA images/A-2551.jpgA images/A-2552.jpgA images/A-2553.jpgA images/A-2555.jpgA images/A-2556.jpgA images/A-2557.jpgA images/A-2558.jpgA images/A-2559.jpgA images/A-2560.jpgA images/A-2561.jpgA images/A-2562.jpgA images/A-2563.jpgA images/A-2564.jpgA images/DW-101.jpgA images/DW-103.jpgA images/DW-201.jpgA images/DW-203.jpgA images/FE-GC001.jpgA images/FE-GC002.jpgA images/FE-GC003.jpgA images/FE-GC004.jpgA images/FE-GC006.jpgA images/FE-GC007.jpgA images/GB-1053.jpgA images/GB-1054.jpgA images/GB-1055.jpgA images/GB-1056.jpgA images/GB-1057.jpgA images/GB-1058.jpgA images/GB-1059.jpgA images/GB-1060.jpgA images/GB-1061.jpgA images/GB-1062.jpgA images/GB-1063.jpgA scripts/color-names.pyA scripts/download-images.jsA scripts/image-audit.jsA scripts/stage-db.js
Diff
commit bd416c6bc042b9b41f14718ee9f3d65aad9e08b9
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Wed Jul 22 17:40:02 2026 -0700
add download-images, color-names (PIL hue buckets), stage-db (tokiwa_catalog), image-audit scripts
---
images/005-801-003-301.jpg | Bin 0 -> 6726129 bytes
images/005-801-003-305.jpg | Bin 0 -> 7787032 bytes
images/005-801-003-307.jpg | Bin 0 -> 8851017 bytes
images/005-801-003-308.jpg | Bin 0 -> 6612361 bytes
images/005-801-003-310.jpg | Bin 0 -> 8119708 bytes
images/005-802-003-301.jpg | Bin 0 -> 6565068 bytes
images/005-802-003-305.jpg | Bin 0 -> 8212762 bytes
images/005-802-003-307.jpg | Bin 0 -> 8253563 bytes
images/005-802-003-308.jpg | Bin 0 -> 6424299 bytes
images/005-802-003-310.jpg | Bin 0 -> 7674954 bytes
images/005-803-003-301.jpg | Bin 0 -> 5553107 bytes
images/005-803-003-305.jpg | Bin 0 -> 7135132 bytes
images/005-803-003-307.jpg | Bin 0 -> 7820412 bytes
images/005-803-003-308.jpg | Bin 0 -> 5817662 bytes
images/005-804-003-301.jpg | Bin 0 -> 6474318 bytes
images/005-804-003-305.jpg | Bin 0 -> 7634847 bytes
images/005-804-003-307.jpg | Bin 0 -> 7593436 bytes
images/005-804-003-308.jpg | Bin 0 -> 6037609 bytes
images/005-804-003-310.jpg | Bin 0 -> 7509471 bytes
images/005-805-003-301.jpg | Bin 0 -> 5644507 bytes
images/005-805-003-305.jpg | Bin 0 -> 6055966 bytes
images/005-805-003-307.jpg | Bin 0 -> 6791598 bytes
images/005-805-003-308.jpg | Bin 0 -> 5533436 bytes
images/005-805-003-310.jpg | Bin 0 -> 6274858 bytes
images/0509.jpg | Bin 0 -> 272905 bytes
images/0510.jpg | Bin 0 -> 360682 bytes
images/0511.jpg | Bin 0 -> 337370 bytes
images/0512.jpg | Bin 0 -> 409611 bytes
images/0513.jpg | Bin 0 -> 423788 bytes
images/0514.jpg | Bin 0 -> 430035 bytes
images/0709.jpg | Bin 0 -> 399393 bytes
images/0710.jpg | Bin 0 -> 512040 bytes
images/0711.jpg | Bin 0 -> 493131 bytes
images/0712.jpg | Bin 0 -> 527067 bytes
images/0713.jpg | Bin 0 -> 539414 bytes
images/1201.jpg | Bin 0 -> 387666 bytes
images/1202.jpg | Bin 0 -> 465730 bytes
images/1203.jpg | Bin 0 -> 523236 bytes
images/1204.jpg | Bin 0 -> 566135 bytes
images/1205.jpg | Bin 0 -> 534590 bytes
images/1206.jpg | Bin 0 -> 524297 bytes
images/1207.jpg | Bin 0 -> 536972 bytes
images/1208.jpg | Bin 0 -> 519816 bytes
images/1301.jpg | Bin 0 -> 243068 bytes
images/1302.jpg | Bin 0 -> 231406 bytes
images/1303.jpg | Bin 0 -> 277739 bytes
images/1304.jpg | Bin 0 -> 279820 bytes
images/1305.jpg | Bin 0 -> 294191 bytes
images/1306.jpg | Bin 0 -> 282282 bytes
images/1401.jpg | Bin 0 -> 315709 bytes
images/1402.jpg | Bin 0 -> 339273 bytes
images/1403.jpg | Bin 0 -> 318931 bytes
images/1405.jpg | Bin 0 -> 409807 bytes
images/1406.jpg | Bin 0 -> 415033 bytes
images/1501.jpg | Bin 0 -> 414139 bytes
images/1502.jpg | Bin 0 -> 451260 bytes
images/1503.jpg | Bin 0 -> 430302 bytes
images/1504.jpg | Bin 0 -> 436437 bytes
images/A-18001.jpg | Bin 0 -> 4805279 bytes
images/A-18002.jpg | Bin 0 -> 4906720 bytes
images/A-18003.jpg | Bin 0 -> 3311916 bytes
images/A-18004.jpg | Bin 0 -> 5455715 bytes
images/A-18005.jpg | Bin 0 -> 5553690 bytes
images/A-18006.jpg | Bin 0 -> 4754182 bytes
images/A-18007.jpg | Bin 0 -> 4559825 bytes
images/A-18008.jpg | Bin 0 -> 3672548 bytes
images/A-18009.jpg | Bin 0 -> 3649097 bytes
images/A-18010.jpg | Bin 0 -> 3940144 bytes
images/A-2550.jpg | Bin 0 -> 4742048 bytes
images/A-2551.jpg | Bin 0 -> 4641122 bytes
images/A-2552.jpg | Bin 0 -> 3614775 bytes
images/A-2553.jpg | Bin 0 -> 4254511 bytes
images/A-2555.jpg | Bin 0 -> 4559539 bytes
images/A-2556.jpg | Bin 0 -> 5019398 bytes
images/A-2557.jpg | Bin 0 -> 4856244 bytes
images/A-2558.jpg | Bin 0 -> 6025872 bytes
images/A-2559.jpg | Bin 0 -> 5936532 bytes
images/A-2560.jpg | Bin 0 -> 5808083 bytes
images/A-2561.jpg | Bin 0 -> 5435652 bytes
images/A-2562.jpg | Bin 0 -> 5290585 bytes
images/A-2563.jpg | Bin 0 -> 5632058 bytes
images/A-2564.jpg | Bin 0 -> 6318491 bytes
images/DW-101.jpg | Bin 0 -> 1087450 bytes
images/DW-103.jpg | Bin 0 -> 1187724 bytes
images/DW-201.jpg | Bin 0 -> 1237486 bytes
images/DW-203.jpg | Bin 0 -> 1255551 bytes
images/FE-GC001.jpg | Bin 0 -> 301881 bytes
images/FE-GC002.jpg | Bin 0 -> 309730 bytes
images/FE-GC003.jpg | Bin 0 -> 366303 bytes
images/FE-GC004.jpg | Bin 0 -> 303606 bytes
images/FE-GC006.jpg | Bin 0 -> 314982 bytes
images/FE-GC007.jpg | Bin 0 -> 307727 bytes
images/GB-1053.jpg | Bin 0 -> 2120882 bytes
images/GB-1054.jpg | Bin 0 -> 2037379 bytes
images/GB-1055.jpg | Bin 0 -> 1830099 bytes
images/GB-1056.jpg | Bin 0 -> 1734329 bytes
images/GB-1057.jpg | Bin 0 -> 1855256 bytes
images/GB-1058.jpg | Bin 0 -> 1871593 bytes
images/GB-1059.jpg | Bin 0 -> 1794891 bytes
images/GB-1060.jpg | Bin 0 -> 1847912 bytes
images/GB-1061.jpg | Bin 0 -> 2058016 bytes
images/GB-1062.jpg | Bin 0 -> 2029509 bytes
images/GB-1063.jpg | Bin 0 -> 1710622 bytes
scripts/color-names.py | 67 ++++++++++++++++++++++++++++++++++++++
scripts/download-images.js | 41 ++++++++++++++++++++++++
scripts/image-audit.js | 46 ++++++++++++++++++++++++++
scripts/stage-db.js | 78 +++++++++++++++++++++++++++++++++++++++++++++
107 files changed, 232 insertions(+)
diff --git a/images/005-801-003-301.jpg b/images/005-801-003-301.jpg
new file mode 100644
index 0000000..0a7e66e
Binary files /dev/null and b/images/005-801-003-301.jpg differ
diff --git a/images/005-801-003-305.jpg b/images/005-801-003-305.jpg
new file mode 100644
index 0000000..64ec616
Binary files /dev/null and b/images/005-801-003-305.jpg differ
diff --git a/images/005-801-003-307.jpg b/images/005-801-003-307.jpg
new file mode 100644
index 0000000..cd720af
Binary files /dev/null and b/images/005-801-003-307.jpg differ
diff --git a/images/005-801-003-308.jpg b/images/005-801-003-308.jpg
new file mode 100644
index 0000000..ca31392
Binary files /dev/null and b/images/005-801-003-308.jpg differ
diff --git a/images/005-801-003-310.jpg b/images/005-801-003-310.jpg
new file mode 100644
index 0000000..5e13bcc
Binary files /dev/null and b/images/005-801-003-310.jpg differ
diff --git a/images/005-802-003-301.jpg b/images/005-802-003-301.jpg
new file mode 100644
index 0000000..8d9a9ae
Binary files /dev/null and b/images/005-802-003-301.jpg differ
diff --git a/images/005-802-003-305.jpg b/images/005-802-003-305.jpg
new file mode 100644
index 0000000..1f29cf3
Binary files /dev/null and b/images/005-802-003-305.jpg differ
diff --git a/images/005-802-003-307.jpg b/images/005-802-003-307.jpg
new file mode 100644
index 0000000..aec9261
Binary files /dev/null and b/images/005-802-003-307.jpg differ
diff --git a/images/005-802-003-308.jpg b/images/005-802-003-308.jpg
new file mode 100644
index 0000000..90e6afe
Binary files /dev/null and b/images/005-802-003-308.jpg differ
diff --git a/images/005-802-003-310.jpg b/images/005-802-003-310.jpg
new file mode 100644
index 0000000..5237f7d
Binary files /dev/null and b/images/005-802-003-310.jpg differ
diff --git a/images/005-803-003-301.jpg b/images/005-803-003-301.jpg
new file mode 100644
index 0000000..e6657a0
Binary files /dev/null and b/images/005-803-003-301.jpg differ
diff --git a/images/005-803-003-305.jpg b/images/005-803-003-305.jpg
new file mode 100644
index 0000000..5e3f40e
Binary files /dev/null and b/images/005-803-003-305.jpg differ
diff --git a/images/005-803-003-307.jpg b/images/005-803-003-307.jpg
new file mode 100644
index 0000000..c63f9d7
Binary files /dev/null and b/images/005-803-003-307.jpg differ
diff --git a/images/005-803-003-308.jpg b/images/005-803-003-308.jpg
new file mode 100644
index 0000000..f5c1571
Binary files /dev/null and b/images/005-803-003-308.jpg differ
diff --git a/images/005-804-003-301.jpg b/images/005-804-003-301.jpg
new file mode 100644
index 0000000..7b7a40f
Binary files /dev/null and b/images/005-804-003-301.jpg differ
diff --git a/images/005-804-003-305.jpg b/images/005-804-003-305.jpg
new file mode 100644
index 0000000..a032d82
Binary files /dev/null and b/images/005-804-003-305.jpg differ
diff --git a/images/005-804-003-307.jpg b/images/005-804-003-307.jpg
new file mode 100644
index 0000000..6f1e371
Binary files /dev/null and b/images/005-804-003-307.jpg differ
diff --git a/images/005-804-003-308.jpg b/images/005-804-003-308.jpg
new file mode 100644
index 0000000..a7ab1d2
Binary files /dev/null and b/images/005-804-003-308.jpg differ
diff --git a/images/005-804-003-310.jpg b/images/005-804-003-310.jpg
new file mode 100644
index 0000000..0ce5c57
Binary files /dev/null and b/images/005-804-003-310.jpg differ
diff --git a/images/005-805-003-301.jpg b/images/005-805-003-301.jpg
new file mode 100644
index 0000000..f14d4d0
Binary files /dev/null and b/images/005-805-003-301.jpg differ
diff --git a/images/005-805-003-305.jpg b/images/005-805-003-305.jpg
new file mode 100644
index 0000000..0bd6ced
Binary files /dev/null and b/images/005-805-003-305.jpg differ
diff --git a/images/005-805-003-307.jpg b/images/005-805-003-307.jpg
new file mode 100644
index 0000000..dc7daf8
Binary files /dev/null and b/images/005-805-003-307.jpg differ
diff --git a/images/005-805-003-308.jpg b/images/005-805-003-308.jpg
new file mode 100644
index 0000000..d94d949
Binary files /dev/null and b/images/005-805-003-308.jpg differ
diff --git a/images/005-805-003-310.jpg b/images/005-805-003-310.jpg
new file mode 100644
index 0000000..e232d31
Binary files /dev/null and b/images/005-805-003-310.jpg differ
diff --git a/images/0509.jpg b/images/0509.jpg
new file mode 100644
index 0000000..d979a85
Binary files /dev/null and b/images/0509.jpg differ
diff --git a/images/0510.jpg b/images/0510.jpg
new file mode 100644
index 0000000..c39fb1a
Binary files /dev/null and b/images/0510.jpg differ
diff --git a/images/0511.jpg b/images/0511.jpg
new file mode 100644
index 0000000..8245944
Binary files /dev/null and b/images/0511.jpg differ
diff --git a/images/0512.jpg b/images/0512.jpg
new file mode 100644
index 0000000..2dba65b
Binary files /dev/null and b/images/0512.jpg differ
diff --git a/images/0513.jpg b/images/0513.jpg
new file mode 100644
index 0000000..d80cb0e
Binary files /dev/null and b/images/0513.jpg differ
diff --git a/images/0514.jpg b/images/0514.jpg
new file mode 100644
index 0000000..1ae7cf6
Binary files /dev/null and b/images/0514.jpg differ
diff --git a/images/0709.jpg b/images/0709.jpg
new file mode 100644
index 0000000..7009251
Binary files /dev/null and b/images/0709.jpg differ
diff --git a/images/0710.jpg b/images/0710.jpg
new file mode 100644
index 0000000..a49504c
Binary files /dev/null and b/images/0710.jpg differ
diff --git a/images/0711.jpg b/images/0711.jpg
new file mode 100644
index 0000000..a3a5237
Binary files /dev/null and b/images/0711.jpg differ
diff --git a/images/0712.jpg b/images/0712.jpg
new file mode 100644
index 0000000..88bfc7f
Binary files /dev/null and b/images/0712.jpg differ
diff --git a/images/0713.jpg b/images/0713.jpg
new file mode 100644
index 0000000..602cbe9
Binary files /dev/null and b/images/0713.jpg differ
diff --git a/images/1201.jpg b/images/1201.jpg
new file mode 100644
index 0000000..cc56546
Binary files /dev/null and b/images/1201.jpg differ
diff --git a/images/1202.jpg b/images/1202.jpg
new file mode 100644
index 0000000..632fcb0
Binary files /dev/null and b/images/1202.jpg differ
diff --git a/images/1203.jpg b/images/1203.jpg
new file mode 100644
index 0000000..bd7d584
Binary files /dev/null and b/images/1203.jpg differ
diff --git a/images/1204.jpg b/images/1204.jpg
new file mode 100644
index 0000000..e0bc325
Binary files /dev/null and b/images/1204.jpg differ
diff --git a/images/1205.jpg b/images/1205.jpg
new file mode 100644
index 0000000..9a92c0b
Binary files /dev/null and b/images/1205.jpg differ
diff --git a/images/1206.jpg b/images/1206.jpg
new file mode 100644
index 0000000..779383d
Binary files /dev/null and b/images/1206.jpg differ
diff --git a/images/1207.jpg b/images/1207.jpg
new file mode 100644
index 0000000..e18dab9
Binary files /dev/null and b/images/1207.jpg differ
diff --git a/images/1208.jpg b/images/1208.jpg
new file mode 100644
index 0000000..8807f0f
Binary files /dev/null and b/images/1208.jpg differ
diff --git a/images/1301.jpg b/images/1301.jpg
new file mode 100644
index 0000000..e0ed096
Binary files /dev/null and b/images/1301.jpg differ
diff --git a/images/1302.jpg b/images/1302.jpg
new file mode 100644
index 0000000..7250728
Binary files /dev/null and b/images/1302.jpg differ
diff --git a/images/1303.jpg b/images/1303.jpg
new file mode 100644
index 0000000..cb71b28
Binary files /dev/null and b/images/1303.jpg differ
diff --git a/images/1304.jpg b/images/1304.jpg
new file mode 100644
index 0000000..f0191a7
Binary files /dev/null and b/images/1304.jpg differ
diff --git a/images/1305.jpg b/images/1305.jpg
new file mode 100644
index 0000000..2fa6da5
Binary files /dev/null and b/images/1305.jpg differ
diff --git a/images/1306.jpg b/images/1306.jpg
new file mode 100644
index 0000000..a10e631
Binary files /dev/null and b/images/1306.jpg differ
diff --git a/images/1401.jpg b/images/1401.jpg
new file mode 100644
index 0000000..84afa87
Binary files /dev/null and b/images/1401.jpg differ
diff --git a/images/1402.jpg b/images/1402.jpg
new file mode 100644
index 0000000..cdb4540
Binary files /dev/null and b/images/1402.jpg differ
diff --git a/images/1403.jpg b/images/1403.jpg
new file mode 100644
index 0000000..cf60d19
Binary files /dev/null and b/images/1403.jpg differ
diff --git a/images/1405.jpg b/images/1405.jpg
new file mode 100644
index 0000000..8905c47
Binary files /dev/null and b/images/1405.jpg differ
diff --git a/images/1406.jpg b/images/1406.jpg
new file mode 100644
index 0000000..72872e8
Binary files /dev/null and b/images/1406.jpg differ
diff --git a/images/1501.jpg b/images/1501.jpg
new file mode 100644
index 0000000..24b4104
Binary files /dev/null and b/images/1501.jpg differ
diff --git a/images/1502.jpg b/images/1502.jpg
new file mode 100644
index 0000000..e285ed1
Binary files /dev/null and b/images/1502.jpg differ
diff --git a/images/1503.jpg b/images/1503.jpg
new file mode 100644
index 0000000..38f9467
Binary files /dev/null and b/images/1503.jpg differ
diff --git a/images/1504.jpg b/images/1504.jpg
new file mode 100644
index 0000000..24d0ae7
Binary files /dev/null and b/images/1504.jpg differ
diff --git a/images/A-18001.jpg b/images/A-18001.jpg
new file mode 100644
index 0000000..5587007
Binary files /dev/null and b/images/A-18001.jpg differ
diff --git a/images/A-18002.jpg b/images/A-18002.jpg
new file mode 100644
index 0000000..8acca2c
Binary files /dev/null and b/images/A-18002.jpg differ
diff --git a/images/A-18003.jpg b/images/A-18003.jpg
new file mode 100644
index 0000000..0322474
Binary files /dev/null and b/images/A-18003.jpg differ
diff --git a/images/A-18004.jpg b/images/A-18004.jpg
new file mode 100644
index 0000000..5b5da4f
Binary files /dev/null and b/images/A-18004.jpg differ
diff --git a/images/A-18005.jpg b/images/A-18005.jpg
new file mode 100644
index 0000000..0bd32f6
Binary files /dev/null and b/images/A-18005.jpg differ
diff --git a/images/A-18006.jpg b/images/A-18006.jpg
new file mode 100644
index 0000000..f274702
Binary files /dev/null and b/images/A-18006.jpg differ
diff --git a/images/A-18007.jpg b/images/A-18007.jpg
new file mode 100644
index 0000000..51f2cf2
Binary files /dev/null and b/images/A-18007.jpg differ
diff --git a/images/A-18008.jpg b/images/A-18008.jpg
new file mode 100644
index 0000000..e55057f
Binary files /dev/null and b/images/A-18008.jpg differ
diff --git a/images/A-18009.jpg b/images/A-18009.jpg
new file mode 100644
index 0000000..952e578
Binary files /dev/null and b/images/A-18009.jpg differ
diff --git a/images/A-18010.jpg b/images/A-18010.jpg
new file mode 100644
index 0000000..4f3c75e
Binary files /dev/null and b/images/A-18010.jpg differ
diff --git a/images/A-2550.jpg b/images/A-2550.jpg
new file mode 100644
index 0000000..cbba964
Binary files /dev/null and b/images/A-2550.jpg differ
diff --git a/images/A-2551.jpg b/images/A-2551.jpg
new file mode 100644
index 0000000..0d29800
Binary files /dev/null and b/images/A-2551.jpg differ
diff --git a/images/A-2552.jpg b/images/A-2552.jpg
new file mode 100644
index 0000000..c485303
Binary files /dev/null and b/images/A-2552.jpg differ
diff --git a/images/A-2553.jpg b/images/A-2553.jpg
new file mode 100644
index 0000000..997e0b2
Binary files /dev/null and b/images/A-2553.jpg differ
diff --git a/images/A-2555.jpg b/images/A-2555.jpg
new file mode 100644
index 0000000..1fb8338
Binary files /dev/null and b/images/A-2555.jpg differ
diff --git a/images/A-2556.jpg b/images/A-2556.jpg
new file mode 100644
index 0000000..4cc91ee
Binary files /dev/null and b/images/A-2556.jpg differ
diff --git a/images/A-2557.jpg b/images/A-2557.jpg
new file mode 100644
index 0000000..65c565a
Binary files /dev/null and b/images/A-2557.jpg differ
diff --git a/images/A-2558.jpg b/images/A-2558.jpg
new file mode 100644
index 0000000..8378f71
Binary files /dev/null and b/images/A-2558.jpg differ
diff --git a/images/A-2559.jpg b/images/A-2559.jpg
new file mode 100644
index 0000000..8df9bfc
Binary files /dev/null and b/images/A-2559.jpg differ
diff --git a/images/A-2560.jpg b/images/A-2560.jpg
new file mode 100644
index 0000000..f22a8f8
Binary files /dev/null and b/images/A-2560.jpg differ
diff --git a/images/A-2561.jpg b/images/A-2561.jpg
new file mode 100644
index 0000000..4d65cb8
Binary files /dev/null and b/images/A-2561.jpg differ
diff --git a/images/A-2562.jpg b/images/A-2562.jpg
new file mode 100644
index 0000000..dac2d6f
Binary files /dev/null and b/images/A-2562.jpg differ
diff --git a/images/A-2563.jpg b/images/A-2563.jpg
new file mode 100644
index 0000000..9778f74
Binary files /dev/null and b/images/A-2563.jpg differ
diff --git a/images/A-2564.jpg b/images/A-2564.jpg
new file mode 100644
index 0000000..25fbfe1
Binary files /dev/null and b/images/A-2564.jpg differ
diff --git a/images/DW-101.jpg b/images/DW-101.jpg
new file mode 100644
index 0000000..eb858f5
Binary files /dev/null and b/images/DW-101.jpg differ
diff --git a/images/DW-103.jpg b/images/DW-103.jpg
new file mode 100644
index 0000000..b6e507c
Binary files /dev/null and b/images/DW-103.jpg differ
diff --git a/images/DW-201.jpg b/images/DW-201.jpg
new file mode 100644
index 0000000..c45965b
Binary files /dev/null and b/images/DW-201.jpg differ
diff --git a/images/DW-203.jpg b/images/DW-203.jpg
new file mode 100644
index 0000000..672f6ce
Binary files /dev/null and b/images/DW-203.jpg differ
diff --git a/images/FE-GC001.jpg b/images/FE-GC001.jpg
new file mode 100644
index 0000000..d9fb224
Binary files /dev/null and b/images/FE-GC001.jpg differ
diff --git a/images/FE-GC002.jpg b/images/FE-GC002.jpg
new file mode 100644
index 0000000..69e19ac
Binary files /dev/null and b/images/FE-GC002.jpg differ
diff --git a/images/FE-GC003.jpg b/images/FE-GC003.jpg
new file mode 100644
index 0000000..19322e1
Binary files /dev/null and b/images/FE-GC003.jpg differ
diff --git a/images/FE-GC004.jpg b/images/FE-GC004.jpg
new file mode 100644
index 0000000..96324da
Binary files /dev/null and b/images/FE-GC004.jpg differ
diff --git a/images/FE-GC006.jpg b/images/FE-GC006.jpg
new file mode 100644
index 0000000..f3edae7
Binary files /dev/null and b/images/FE-GC006.jpg differ
diff --git a/images/FE-GC007.jpg b/images/FE-GC007.jpg
new file mode 100644
index 0000000..76188a1
Binary files /dev/null and b/images/FE-GC007.jpg differ
diff --git a/images/GB-1053.jpg b/images/GB-1053.jpg
new file mode 100644
index 0000000..783eec4
Binary files /dev/null and b/images/GB-1053.jpg differ
diff --git a/images/GB-1054.jpg b/images/GB-1054.jpg
new file mode 100644
index 0000000..1e16a2e
Binary files /dev/null and b/images/GB-1054.jpg differ
diff --git a/images/GB-1055.jpg b/images/GB-1055.jpg
new file mode 100644
index 0000000..3f6d449
Binary files /dev/null and b/images/GB-1055.jpg differ
diff --git a/images/GB-1056.jpg b/images/GB-1056.jpg
new file mode 100644
index 0000000..82ce9da
Binary files /dev/null and b/images/GB-1056.jpg differ
diff --git a/images/GB-1057.jpg b/images/GB-1057.jpg
new file mode 100644
index 0000000..583da91
Binary files /dev/null and b/images/GB-1057.jpg differ
diff --git a/images/GB-1058.jpg b/images/GB-1058.jpg
new file mode 100644
index 0000000..3e9c6bb
Binary files /dev/null and b/images/GB-1058.jpg differ
diff --git a/images/GB-1059.jpg b/images/GB-1059.jpg
new file mode 100644
index 0000000..aa8f5ab
Binary files /dev/null and b/images/GB-1059.jpg differ
diff --git a/images/GB-1060.jpg b/images/GB-1060.jpg
new file mode 100644
index 0000000..b4b5e78
Binary files /dev/null and b/images/GB-1060.jpg differ
diff --git a/images/GB-1061.jpg b/images/GB-1061.jpg
new file mode 100644
index 0000000..c7aa7a9
Binary files /dev/null and b/images/GB-1061.jpg differ
diff --git a/images/GB-1062.jpg b/images/GB-1062.jpg
new file mode 100644
index 0000000..d2dd076
Binary files /dev/null and b/images/GB-1062.jpg differ
diff --git a/images/GB-1063.jpg b/images/GB-1063.jpg
new file mode 100644
index 0000000..ef60e2c
Binary files /dev/null and b/images/GB-1063.jpg differ
diff --git a/scripts/color-names.py b/scripts/color-names.py
new file mode 100644
index 0000000..18a4c6e
--- /dev/null
+++ b/scripts/color-names.py
@@ -0,0 +1,67 @@
+#!/usr/bin/env python3
+"""Derive interior-designer-lexicon color names from dominant hue of each local image.
+Simple hue/sat/lightness bucket -> name table (enrichment pass comes later).
+Writes data/colors.json: { mfr_sku: {hex, name} }
+"""
+import json, os, sys, colorsys
+from PIL import Image
+
+ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+products = json.load(open(os.path.join(ROOT, 'data', 'products.json')))
+
+def dominant_color(path):
+ im = Image.open(path).convert('RGB')
+ # center crop 60% to avoid borders/shadows, then shrink
+ w, h = im.size
+ im = im.crop((int(w*0.2), int(h*0.2), int(w*0.8), int(h*0.8))).resize((50, 50))
+ px = list(im.getdata())
+ r = sum(p[0] for p in px)//len(px); g = sum(p[1] for p in px)//len(px); b = sum(p[2] for p in px)//len(px)
+ return r, g, b
+
+def name_for(r, g, b):
+ hh, ll, ss = colorsys.rgb_to_hls(r/255, g/255, b/255)
+ hue = hh*360
+ # neutrals first
+ if ss < 0.09:
+ if ll > 0.88: return 'Alabaster'
+ if ll > 0.75: return 'Ivory'
+ if ll > 0.60: return 'Greige'
+ if ll > 0.45: return 'Pewter'
+ if ll > 0.30: return 'Slate'
+ if ll > 0.15: return 'Charcoal'
+ return 'Ebony'
+ warm_neutral = ss < 0.25
+ if hue < 15 or hue >= 345:
+ return 'Blush' if ll > 0.7 else ('Terracotta' if ll > 0.4 else 'Garnet')
+ if hue < 45:
+ if warm_neutral:
+ return 'Oatmeal' if ll > 0.7 else ('Fawn' if ll > 0.45 else 'Espresso')
+ return 'Sand' if ll > 0.7 else ('Amber' if ll > 0.45 else 'Sienna')
+ if hue < 70:
+ return 'Champagne' if ll > 0.72 else ('Ochre' if ll > 0.45 else 'Bronze')
+ if hue < 100:
+ return 'Flax' if ll > 0.72 else ('Sage' if ll > 0.45 else 'Olive')
+ if hue < 165:
+ return 'Celadon' if ll > 0.65 else ('Moss' if ll > 0.4 else 'Forest')
+ if hue < 200:
+ return 'Seaglass' if ll > 0.65 else ('Verdigris' if ll > 0.4 else 'Teal')
+ if hue < 250:
+ return 'Sky' if ll > 0.65 else ('Denim' if ll > 0.4 else 'Indigo')
+ if hue < 290:
+ return 'Lilac' if ll > 0.65 else ('Plum' if ll > 0.4 else 'Aubergine')
+ return 'Rose' if ll > 0.65 else ('Mulberry' if ll > 0.4 else 'Bordeaux')
+
+out, errs = {}, []
+for p in products:
+ path = os.path.join(ROOT, p['image_local'])
+ if not os.path.exists(path):
+ errs.append(p['mfr_sku']); continue
+ try:
+ r, g, b = dominant_color(path)
+ out[p['mfr_sku']] = {'hex': '#%02x%02x%02x' % (r, g, b), 'name': name_for(r, g, b)}
+ except Exception as e:
+ errs.append(p['mfr_sku'])
+
+json.dump(out, open(os.path.join(ROOT, 'data', 'colors.json'), 'w'), indent=1)
+print(f"colored: {len(out)}, missing/error: {len(errs)}")
+if errs: print('errors:', errs[:20])
diff --git a/scripts/download-images.js b/scripts/download-images.js
new file mode 100644
index 0000000..f68c343
--- /dev/null
+++ b/scripts/download-images.js
@@ -0,0 +1,41 @@
+#!/usr/bin/env node
+// Download original full-res wixstatic images to images/<safe mfr_sku>.jpg
+// Verifies every file is a real image > 5KB (guards the WallQuest image-collapse gotcha).
+const fs = require('fs');
+const path = require('path');
+
+const ROOT = path.join(__dirname, '..');
+const products = JSON.parse(fs.readFileSync(path.join(ROOT, 'data', 'products.json')));
+
+function isImage(buf) {
+ if (buf.length < 4) return false;
+ if (buf[0] === 0xFF && buf[1] === 0xD8) return true; // JPEG
+ if (buf[0] === 0x89 && buf[1] === 0x50) return true; // PNG
+ if (buf.slice(0, 4).toString() === 'RIFF') return true; // WebP
+ return false;
+}
+
+(async () => {
+ const results = [];
+ let ok = 0, failed = 0, skipped = 0;
+ for (const p of products) {
+ const dest = path.join(ROOT, p.image_local);
+ if (fs.existsSync(dest) && fs.statSync(dest).size > 5120) { skipped++; continue; }
+ try {
+ const res = await fetch(p.image_url, { headers: { 'User-Agent': 'Mozilla/5.0' } });
+ if (!res.ok) throw new Error(`HTTP ${res.status}`);
+ const buf = Buffer.from(await res.arrayBuffer());
+ if (buf.length <= 5120) throw new Error(`too small: ${buf.length}B`);
+ if (!isImage(buf)) throw new Error('not an image (magic bytes)');
+ fs.writeFileSync(dest, buf);
+ ok++;
+ } catch (e) {
+ failed++;
+ results.push({ mfr_sku: p.mfr_sku, image_url: p.image_url, error: e.message });
+ console.error(`${p.mfr_sku}: ${e.message}`);
+ }
+ await new Promise(r => setTimeout(r, 150));
+ }
+ fs.writeFileSync(path.join(ROOT, 'data', 'image-failures.json'), JSON.stringify(results, null, 2));
+ console.log(`downloaded: ${ok}, cached: ${skipped}, failed: ${failed}`);
+})();
diff --git a/scripts/image-audit.js b/scripts/image-audit.js
new file mode 100644
index 0000000..d6d6baf
--- /dev/null
+++ b/scripts/image-audit.js
@@ -0,0 +1,46 @@
+#!/usr/bin/env node
+// WallQuest image-collapse guard: per PATTERN, compare distinct image checksums vs colorway count.
+// Flags any pattern where colorways share one image file. Also verifies every file real & >5KB.
+const fs = require('fs');
+const path = require('path');
+const crypto = require('crypto');
+
+const ROOT = path.join(__dirname, '..');
+const products = JSON.parse(fs.readFileSync(path.join(ROOT, 'data', 'products.json')));
+
+const byPattern = new Map();
+let missing = [], small = [];
+for (const p of products) {
+ const f = path.join(ROOT, p.image_local);
+ let hash = null;
+ if (!fs.existsSync(f)) missing.push(p.mfr_sku);
+ else if (fs.statSync(f).size <= 5120) small.push(p.mfr_sku);
+ else hash = crypto.createHash('md5').update(fs.readFileSync(f)).digest('hex');
+ const arr = byPattern.get(p.pattern_key) || [];
+ arr.push({ sku: p.mfr_sku, hash });
+ byPattern.set(p.pattern_key, arr);
+}
+
+const flagged = [];
+for (const [key, arr] of byPattern) {
+ const withImg = arr.filter(a => a.hash);
+ const distinct = new Set(withImg.map(a => a.hash)).size;
+ if (withImg.length > 1 && distinct < withImg.length) {
+ // find which skus share
+ const seen = new Map();
+ const dups = [];
+ for (const a of withImg) { if (seen.has(a.hash)) dups.push(`${a.sku}=${seen.get(a.hash)}`); else seen.set(a.hash, a.sku); }
+ flagged.push({ pattern: key, colorways: withImg.length, distinct_images: distinct, shared: dups });
+ }
+}
+
+const report = {
+ total: products.length,
+ with_image: products.length - missing.length - small.length,
+ missing, small,
+ coverage_pct: +(100 * (products.length - missing.length - small.length) / products.length).toFixed(1),
+ shared_image_patterns: flagged,
+};
+fs.writeFileSync(path.join(ROOT, 'data', 'image-audit.json'), JSON.stringify(report, null, 2));
+console.log(JSON.stringify({ ...report, missing: missing.length, small: small.length }, null, 1));
+if (flagged.length) console.log('FLAGGED patterns:', flagged.map(f => f.pattern).join(', '));
diff --git a/scripts/stage-db.js b/scripts/stage-db.js
new file mode 100644
index 0000000..bd8a76e
--- /dev/null
+++ b/scripts/stage-db.js
@@ -0,0 +1,78 @@
+#!/usr/bin/env node
+// Stage Fentucci Naturals (Tokiwa — INTERNAL name only) into dw_unified.tokiwa_catalog
+// PostgreSQL FIRST, isolated NEW staging table, status='staged'. No Shopify, no FileMaker.
+// Applies colorway names from data/colors.json (dedup within pattern: " II", " III"...)
+const fs = require('fs');
+const path = require('path');
+const { execFileSync } = require('child_process');
+
+const ROOT = path.join(__dirname, '..');
+const products = JSON.parse(fs.readFileSync(path.join(ROOT, 'data', 'products.json')));
+const colors = JSON.parse(fs.readFileSync(path.join(ROOT, 'data', 'colors.json')));
+
+const ROMAN = ['', ' II', ' III', ' IV', ' V', ' VI', ' VII', ' VIII', ' IX', ' X',
+ ' XI', ' XII', ' XIII', ' XIV', ' XV', ' XVI', ' XVII', ' XVIII', ' XIX', ' XX'];
+
+// assign deduped color names within each pattern (deterministic: dw_sku order)
+const usedByPattern = new Map();
+for (const p of products) {
+ const c = colors[p.mfr_sku];
+ let base = c ? c.name : null;
+ if (!base) { p.color_name = null; p.color_hex = null; continue; }
+ const used = usedByPattern.get(p.pattern_key) || new Map();
+ const n = used.get(base) || 0;
+ used.set(base, n + 1);
+ usedByPattern.set(p.pattern_key, used);
+ p.color_name = base + (ROMAN[n] !== undefined ? ROMAN[n] : ` ${n + 1}`);
+ p.color_hex = c.hex;
+}
+fs.writeFileSync(path.join(ROOT, 'data', 'products.json'), JSON.stringify(products, null, 2));
+
+const esc = s => s == null ? 'NULL' : `'${String(s).replace(/'/g, "''")}'`;
+
+const ddl = `
+CREATE TABLE IF NOT EXISTS tokiwa_catalog (
+ id serial PRIMARY KEY,
+ mfr_sku text NOT NULL UNIQUE,
+ dw_sku text UNIQUE,
+ pattern_series text,
+ pattern_name text,
+ color_name text,
+ color_hex text,
+ brand text DEFAULT 'Fentucci Naturals',
+ product_type text DEFAULT 'Wallcovering',
+ material text,
+ source_category text,
+ source_url text,
+ image_url text,
+ image_local text,
+ price_mode text DEFAULT 'quote_only',
+ sample_price numeric(10,2) DEFAULT 4.25,
+ status text DEFAULT 'staged',
+ created_at timestamptz DEFAULT now()
+);`;
+
+const rows = products.map(p => `(${[
+ esc(p.mfr_sku), esc(p.dw_sku), esc(p.pattern_series), esc(p.pattern_name),
+ esc(p.color_name), esc(p.color_hex), esc(p.brand), `'Wallcovering'`, esc(p.material),
+ esc(p.source_category), esc(p.source_page), esc(p.image_url), esc(p.image_local),
+ `'quote_only'`, '4.25', `'staged'`,
+].join(',')})`);
+
+const sql = ddl + `
+INSERT INTO tokiwa_catalog (mfr_sku, dw_sku, pattern_series, pattern_name, color_name, color_hex,
+ brand, product_type, material, source_category, source_url, image_url, image_local,
+ price_mode, sample_price, status)
+VALUES\n${rows.join(',\n')}
+ON CONFLICT (mfr_sku) DO UPDATE SET
+ dw_sku = EXCLUDED.dw_sku, pattern_series = EXCLUDED.pattern_series,
+ pattern_name = EXCLUDED.pattern_name, color_name = EXCLUDED.color_name,
+ color_hex = EXCLUDED.color_hex, material = EXCLUDED.material,
+ source_category = EXCLUDED.source_category, source_url = EXCLUDED.source_url,
+ image_url = EXCLUDED.image_url, image_local = EXCLUDED.image_local;
+SELECT count(*) AS staged FROM tokiwa_catalog;`;
+
+const tmp = path.join(ROOT, 'data', 'stage.sql');
+fs.writeFileSync(tmp, sql);
+const out = execFileSync('psql', ['host=/tmp dbname=dw_unified', '-f', tmp], { encoding: 'utf8' });
+console.log(out.split('\n').slice(-6).join('\n'));
← 7b19e7b normalize: 504 products / 64 patterns, deterministic town re
·
back to Fentucci Naturals
·
gitignore images/ — full-res originals project to >1GB (task 20606ea →