{"slug":"fabricut-landing","total":45,"limit":100,"offset":0,"since":null,"commits":[{"hash":"e84ffe0","date":"2026-09-26 09:23:44 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-26T09:21:27 (1 data files) — data/image-restore-map.json","body":""},{"hash":"fbab569","date":"2026-09-25 09:21:18 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-25T09:20:47 (1 data files) — data/image-restore-map.json","body":""},{"hash":"ffdeaef","date":"2026-09-24 09:12:59 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-24T09:12:24 (1 data files) — data/image-restore-map.json","body":""},{"hash":"5137003","date":"2026-09-23 09:32:14 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-23T09:31:43 (1 data files) — data/image-restore-map.json","body":""},{"hash":"b9ac26a","date":"2026-09-22 09:56:29 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-22T09:54:34 (1 data files) — data/image-restore-map.json","body":""},{"hash":"4fba91a","date":"2026-09-21 09:22:50 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-21T09:21:33 (1 data files) — data/image-restore-map.json","body":""},{"hash":"9e6ef99","date":"2026-09-20 09:29:01 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-20T09:27:07 (1 data files) — data/image-restore-map.json","body":""},{"hash":"74067fb","date":"2026-09-19 09:28:38 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-19T09:27:32 (1 data files) — data/image-restore-map.json","body":""},{"hash":"2c806cf","date":"2026-09-18 09:27:56 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-18T09:26:51 (1 data files) — data/image-restore-map.json","body":""},{"hash":"a53606e","date":"2026-09-17 09:22:27 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-17T09:20:48 (1 data files) — data/image-restore-map.json","body":""},{"hash":"fe6f6d2","date":"2026-09-16 09:35:15 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-16T09:33:20 (1 data files) — data/image-restore-map.json","body":""},{"hash":"86026ad","date":"2026-09-15 09:18:07 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-15T09:16:55 (1 data files) — data/image-restore-map.json","body":""},{"hash":"c363263","date":"2026-09-15 04:08:02 -0700","author":"steve@designerwallcoverings.com","subject":"TK-11438: migrate build script postgres connections to unix socket","body":""},{"hash":"cb64a31","date":"2026-09-15 04:07:21 -0700","author":"steve@designerwallcoverings.com","subject":"TK-11438: migrate postgres pool to unix socket (darwin fallback)","body":"Use process.env.PGHOST || darwin?/tmp:127.0.0.1 so Mac2 services use the\nunix socket at /tmp and Kamatera keeps TCP until its own migration.\nUndo: git revert HEAD"},{"hash":"ebe62bd","date":"2026-09-14 09:05:11 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-14T08:53:29 (1 data files) — data/image-restore-map.json","body":""},{"hash":"7c50f58","date":"2026-09-13 09:15:59 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-13T09:13:35 (1 data files) — data/image-restore-map.json","body":""},{"hash":"23bbb76","date":"2026-09-12 09:30:46 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-12T09:28:54 (1 data files) — data/image-restore-map.json","body":""},{"hash":"468f0b0","date":"2026-09-11 09:36:05 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-11T09:31:49 (1 data files) — data/image-restore-map.json","body":""},{"hash":"d1fa60d","date":"2026-09-10 09:27:07 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-10T09:22:46 (1 data files) — data/image-restore-map.json","body":""},{"hash":"20dd4d2","date":"2026-09-09 09:33:28 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-09T09:32:15 (1 data files) — data/image-restore-map.json","body":""},{"hash":"b1c52da","date":"2026-09-08 09:06:41 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-08T09:02:39 (1 data files) — data/image-restore-map.json","body":""},{"hash":"8722a5f","date":"2026-09-07 09:30:08 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-07T09:25:49 (1 data files) — data/image-restore-map.json","body":""},{"hash":"994449d","date":"2026-09-06 09:08:25 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-06T09:04:17 (1 data files) — data/image-restore-map.json","body":""},{"hash":"1f6d109","date":"2026-09-05 09:29:25 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-05T09:24:41 (1 data files) — data/image-restore-map.json","body":""},{"hash":"30021b7","date":"2026-09-04 09:14:31 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-04T09:09:45 (1 data files) — data/image-restore-map.json","body":""},{"hash":"bcacd8b","date":"2026-09-04 08:25:08 -0700","author":"Steve Abrams","subject":"deploy: guard prod-only runtime data from rsync --delete","body":"deploy.sh runs 'rsync -az --delete' with no data/ exclude, so a deploy\noverwrote the box's runtime file with the local copy and destroyed\neverything written since the last deploy. Added a surgical\nRSYNC_EXTRA_EXCLUDES for this project's runtime path(s) only, so genuine\nbuild artifacts under data/ keep syncing.\n\nVerified by itemized rsync --dry-run against prod: the runtime file is\nlisted for transfer WITHOUT the exclude and absent WITH it.\n\nFleet sweep, TK-11227. Same bug class as the July 2026 artmura/quadrille\nmis-target fix and the abramsagency lead-ledger fix (TK-10536).\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_013mq9RQtVZZEWvreDqqTgv2"},{"hash":"a28d549","date":"2026-09-03 09:18:48 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-03T09:14:19 (1 data files) — data/image-restore-map.json","body":""},{"hash":"af71374","date":"2026-08-30 09:09:38 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-30T09:05:58 (1 data files) — data/image-restore-map.json","body":""},{"hash":"e62c6ec","date":"2026-08-29 09:09:39 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-29T09:06:18 (1 data files) — data/image-restore-map.json","body":""},{"hash":"a6a7f61","date":"2026-08-28 09:05:51 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-28T09:02:22 (1 data files) — data/image-restore-map.json","body":""},{"hash":"071efa7","date":"2026-08-27 09:37:06 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-27T09:33:34 (1 data files) — data/image-restore-map.json","body":""},{"hash":"193fe24","date":"2026-08-26 09:42:14 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-26T09:38:32 (1 data files) — data/image-restore-map.json","body":""},{"hash":"f2af87b","date":"2026-08-25 09:35:25 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-25T09:32:22 (1 data files) — data/image-restore-map.json","body":""},{"hash":"a94cc21","date":"2026-08-24 20:10:28 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-24T20:06:56 (1 data files) — data/image-restore-map.json","body":""},{"hash":"5986a14","date":"2026-08-24 19:13:04 -0700","author":"Steve Abrams","subject":"fabricut: make localizer restore-map merge-safe (never clobber prior reversibility)","body":"The daily-post recurrence guard runs localize-images.js --apply every day; a\nsteady-state run finds 0 S3 rows and previously rebuilt an EMPTY restore-map,\nwiping reversibility. Now it MERGES by dw_sku (keeps the oldest recorded original\nS3 url, updates the localized target), so the 1325-row map survives empty runs.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"3a38772","date":"2026-08-24 19:12:03 -0700","author":"Steve Abrams","subject":"fabricut: localize all images off vendor S3 to DW public URLs (TK-10823)","body":"- scripts/localize-images.js: download 1310 imgs (272MB) to public/img/fabricut,\n  prefer full-res product_images/<id>.jpg (900x1200) over 600px thumbnails, rewrite\n  fabricut_catalog.image_url(1325)+all_images(579) to\n  https://fabricut.designerwallcoverings.com/img/fabricut/<id>.jpg (DTD 5/5 verdict B:\n  public absolute DW URL works for BOTH microsite AND Shopify daily-post).\n- Rooms were NOT dead — the _stylized_secondary 403 was a casing/encoding artifact;\n  all return HTTP 200. Localized 526 real room shots (real rooms 71->526), dropped\n  only 2 genuinely-403 rooms. NO AI room generation needed (DTD unanimous SKIP).\n- build-fabricut.js: replace obsolete _stylized_secondary drop with an S3-hotlink\n  drop so the microsite never serves off fabricut.img again.\n- scripts/restore-images.js + data/image-restore-map.json: full reversibility.\n- gitignore the 272MB image binaries (reproducible + rsync-shipped on deploy).\n\nproducts.json: 0 S3 hotlinks (was 1325), 1325 DW-local swatches, 526 real rooms.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"77235df","date":"2026-08-24 19:04:47 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-24T19:04:21 (3 data files) — public/img/fabricut/2910902.jpg public/img/fabricut/2910902_stylized_secondary__room.jpg public/img/fabricut/2914903.jpg","body":""},{"hash":"e588706","date":"2026-08-24 18:57:41 -0700","author":"Steve Abrams","subject":"fabricut: filter dead _stylized_secondary room images (403 AccessDenied from vendor S3)","body":""},{"hash":"41f035e","date":"2026-08-24 18:56:22 -0700","author":"Steve","subject":"fix(fabricut): make build schema-resilient + build on canonical Mac2","body":"build-fabricut.js crashed on Kamatera ('column book_name does not exist') because\nthe Kamatera fabricut_catalog mirror is schema-drifted (only has 'collection').\nAdd an information_schema guard so the query degrades gracefully instead of crashing,\nand move the data build to a PREDEPLOY_HOOK that runs on canonical Mac2 (where\nbook_name + real book labels live) — ship the finished products.json instead of\nrebuilding on the drifted mirror. Verified local build: 1325 products, 11 books, 189 patterns."},{"hash":"bdb71d3","date":"2026-08-24 18:44:32 -0700","author":"Steve","subject":"chore(fabricut): rebase onto live — add GA snippet + pin prod port 35959 (reconcile pre-deploy drift)","body":""},{"hash":"c7514d0","date":"2026-08-24 14:01:09 -0700","author":"Steve","subject":"fix(fabricut): group grid by pattern — one card per pattern with colorway swatch strip (1325 cards -> 189)","body":"Root cause of perceived 'duplicates': the grid rendered one card per colorway/SKU,\nso a 189-pattern catalog exploded into 1325 near-identical cards (94% of patterns\nhave >1 colorway). Data/API had 0 true duplicate SKUs. Fix is front-end only:\ngroupByPattern() collapses colorways of a series into one pattern card (swatch strip\n+ N-colors), applied after filtering so facets/search re-group correctly. Verified\nheadless: 189 pattern cards, color filter 0-leak, infinite-scroll no dup."},{"hash":"aa2887a","date":"2026-08-20 13:48:32 -0700","author":"Steve","subject":"chore: v1.0.0 — go-live (session close)","body":""},{"hash":"935a208","date":"2026-08-20 11:02:31 -0700","author":"Steve Abrams","subject":"SEO: dynamic sitemap on public + noindex robots on internal","body":""},{"hash":"5048cfe","date":"2026-08-20 10:44:10 -0700","author":"Steve Abrams","subject":"Public site hardening (Cody red-team FIX FIRST): remove vendor-email/selection/curate routes, strip internal chrome (pill/modal/Stock-Price/net-cost/ordering-internal) via isPublic guard, fix title (no dw_unified), drop Phillipe-Romano curate button, add robots + log-only inquiry","body":""},{"hash":"7c24d19","date":"2026-08-20 10:31:21 -0700","author":"Steve","subject":"Fabricut microsite (fabricut-landing): DW-branded self-contained viewer over fabricut_catalog (1325 products, per-yard, real-hex color sort)","body":""}]}