{"slug":"retrowalls","total":70,"limit":100,"offset":0,"since":null,"commits":[{"hash":"7d3dbeb","date":"2026-07-06 17:57:08 -0700","author":"Steve Abrams","subject":"Square product-card images (aspect-ratio 1/1)","body":""},{"hash":"6502ef1","date":"2026-07-03 09:57:41 -0700","author":"Steve Abrams","subject":"corner-nav: move login to its own hamburger in upper-left (panel slides from left)","body":""},{"hash":"b9d8b89","date":"2026-07-03 08:08:16 -0700","author":"Steve","subject":"chore: macstudio3 migration — reconcile from mac2 + repoint paths (stevestudio2→macstudio3, node/npm/npx→/opt/homebrew)","body":""},{"hash":"1cf0d0e","date":"2026-06-19 16:33:22 -0700","author":"Steve","subject":"Mount new-arrivals promo strip (Tier B): require ../_shared/_universal-promo-banner before express.static — text-only rotating 'New · <product> →' banner from /api/products?sort=newest. Local only; deploy gated.","body":"Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"},{"hash":"70a042d","date":"2026-06-18 09:04:29 -0700","author":"Steve Abrams","subject":"fix: safeImg allow same-origin /img/ proxy urls (vendor-neutral image proxy 2026-06-03) — product cards were falling back to hero-bg (images all wrong)","body":""},{"hash":"cc8f3a4","date":"2026-06-11 09:28:47 -0700","author":"Steve Abrams","subject":"retrowalls: rails fire again — wire sliders + grid filter to aesthetic-OR-tags matcher (prod-safe try-require + inline fallback)","body":""},{"hash":"7d4425e","date":"2026-06-09 13:47:54 -0700","author":"Steve","subject":"step2 vendor-leak fix: dual-key /sample resolver + handle_display hrefs","body":""},{"hash":"b05db52","date":"2026-06-03 21:44:07 -0700","author":"Steve Abrams","subject":"seo: add robots.txt + sitemap.xml (was 404 — crawl gap)","body":""},{"hash":"1a1317d","date":"2026-06-03 20:45:46 -0700","author":"Steve","subject":"Scrub residual vendor names from products.json (title/vendor/tags); preserve sku/handle","body":""},{"hash":"edbec61","date":"2026-06-03 14:19:43 -0700","author":"Steve Abrams","subject":"a11y: add aria-label to contact/sample form inputs (zero visual; screen-reader association)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"286f53e","date":"2026-06-01 16:38:42 -0700","author":"Steve Abrams","subject":"admin: add dw-theme-nav 20-theme navigator (upper-right, admin-only)","body":""},{"hash":"4c2a861","date":"2026-06-01 15:21:14 -0700","author":"Steve","subject":"hero: rotate curated room-setting pool (hero-pool.json), guard >=1400px, no swatch blur","body":""},{"hash":"58219f9","date":"2026-06-01 14:15:59 -0700","author":"Steve","subject":"homepage: retire redundant corner-nav.js (ns-header hamburger is the live nav)","body":"Brings retrowalls in line with the other 47 sister sites: the static\n.ns-header + nsToggleNav() hamburger is the working nav, so the legacy\ncorner-nav.js overlay is redundant. Eyebrow fix already committed prior."},{"hash":"f971984","date":"2026-06-01 13:59:23 -0700","author":"Steve","subject":"homepage: collapse duplicated 'Ideas' rail-eyebrows into one section eyebrow","body":""},{"hash":"20fcec5","date":"2026-06-01 13:56:43 -0700","author":"Steve Abrams","subject":"Unique hero image (backsync from prod, fleet hero dedup 2026-06-01)","body":""},{"hash":"b877cdb","date":"2026-06-01 13:48:44 -0700","author":"Steve Abrams","subject":"Revert \"Remove Big Red widget — never UX-worked, collided with Help pill (fleet sweep)\"","body":"This reverts commit 92b10d45d5ad91e067902baad6bf0ee609191f1f."},{"hash":"1f44003","date":"2026-06-01 13:36:31 -0700","author":"Steve","subject":"hero: activate self-contained 2x2 hero-4grid (fleet sweep, local)","body":""},{"hash":"92b10d4","date":"2026-06-01 13:33:08 -0700","author":"Steve Abrams","subject":"Remove Big Red widget — never UX-worked, collided with Help pill (fleet sweep)","body":""},{"hash":"216a456","date":"2026-06-01 07:45:08 -0700","author":"Steve Abrams","subject":"/api/facets honors q+aesthetic+vendor filters via shared filterProducts() — counts + total reflect filtered set, not unfiltered catalog","body":""},{"hash":"4e776b9","date":"2026-06-01 07:44:46 -0700","author":"Steve Abrams","subject":"noopener,noreferrer on sister-site map window.open(_blank)","body":""},{"hash":"e76c444","date":"2026-05-30 21:27:10 -0700","author":"Steve Abrams","subject":"fix: block .bak-TIMESTAMP backup files from being served + add *.bak-* to .gitignore","body":"public/index.html.bak-20260526152130 was accessible via HTTP (200) because\nthe bak-guard regex only matched .bak followed by a dot or EOL, not .bak-*.\nUpdated regex to /\\.bak(?:[\\.\\-]|$)/ to cover all three variants (.bak, .bak.,\n.bak-). Removed the leaked file and added *.bak-* to .gitignore.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>"},{"hash":"8d0ed49","date":"2026-05-29 13:20:44 -0700","author":"Steve Abrams","subject":"feat(fleet): theme1/theme2 query-param-gated toggle on catalog page","body":"Default: theme1, toggle hidden. Opt-in via ?theme=2 or localStorage\n('wallco-page-theme' key shared across the fleet). Same gate pattern\nas dw-domain-fleet productPage."},{"hash":"0e8b620","date":"2026-05-28 07:26:20 -0700","author":"Steve","subject":"scrub vendor name leaks from products.json source (344 products: title/vendor/tags cleaned per sku-redact denylist)","body":""},{"hash":"ca212d4","date":"2026-05-26 15:25:19 -0700","author":"Steve","subject":"frontend: cleanSku() strips vendor names from displayed sku (.ven/list/detail) + defer renderRailSections call (fix ReferenceError) — click-through verified","body":""},{"hash":"cc7338e","date":"2026-05-26 15:16:05 -0700","author":"Steve Abrams","subject":"sku-redact: wire shared vendor-id display scrubber","body":""},{"hash":"644afec","date":"2026-05-26 09:59:54 -0700","author":"Steve","subject":"rails: editorial labels for firing aesthetic buckets","body":""},{"hash":"2049623","date":"2026-05-26 08:12:07 -0700","author":"Steve Abrams","subject":"rails: wire /api/sliders into horizontal scroll-snap rail sections [fixed]","body":""},{"hash":"15614c6","date":"2026-05-25 21:32:11 -0700","author":"Steve Abrams","subject":"pre-hydrate density --cols CSS var before first paint — eliminates 6→saved flash on reload","body":""},{"hash":"f096823","date":"2026-05-25 21:31:52 -0700","author":"Steve Abrams","subject":"redact p.vendor on Ideas rail — replace with 'Designer Wallcoverings' brand string","body":""},{"hash":"b3bdcce","date":"2026-05-25 21:31:38 -0700","author":"Steve Abrams","subject":"wire api-vendor-redact middleware as first app.use() — strips vendor field + vendors facet from /api/* responses","body":""},{"hash":"21a9a16","date":"2026-05-25 20:46:12 -0700","author":"Steve Abrams","subject":"pull-from-shopify: use shared classifier with rails primary, local aestheticOf as fallback","body":""},{"hash":"30b2add","date":"2026-05-25 20:37:38 -0700","author":"Steve Abrams","subject":"retag aesthetic from PG: 573 rows updated","body":"before: all=600\nafter:  abstract=3, all=27, damask=130, deco=31, geometric=401, global=7, vintage=1\n\nBackfills correct multi-bucket aesthetic tagging from dw_unified.microsite_products\n(DTD verdict B, 2026-05-25 fleet retag run).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"},{"hash":"caa78e6","date":"2026-05-20 00:27:42 -0700","author":"Steve","subject":"add: pre-stage Meta Pixel snippet (placeholder; flip via _dw-batch set-fb-pixel.sh)","body":"Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"},{"hash":"b4cd573","date":"2026-05-19 23:52:31 -0700","author":"Steve Abrams","subject":"make server.js self-contained — gate _shared/admin-catalog behind MICROSITE_ADMIN_ENABLED env flag (kamatera deploy unblock)","body":""},{"hash":"a2f77f5","date":"2026-05-19 15:16:12 -0700","author":"Steve Abrams","subject":"sort: hydrate saved sort from localStorage before first grid load + send to /api/products","body":"Completes the sort wire-up — change listener was already attached but state.sort\nwas never restored on load and never sent as a query param, so the saved selection\nhad no effect on first render.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"},{"hash":"d3b1cfc","date":"2026-05-19 15:16:02 -0700","author":"Steve Abrams","subject":"fix(grid): hydrate saved sort BEFORE first /api/products call","body":"Two bugs combined to make the saved sort effectively write-only:\n1. loadGridPage() didn't pass state.sort to the server, so the API\n   always defaulted to 'newest' regardless of the slider state.\n2. The sort-select wire-up that reads localStorage and assigns\n   state.sort runs AFTER loadGridPage(), so even if the API had read\n   state.sort it would have seen the default 'newest'.\n\nFix: hydrate state.sort from localStorage in the early state-init block\n(alongside view), and include state.sort in the /api/products query string.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"},{"hash":"daad56e","date":"2026-05-19 15:15:08 -0700","author":"Steve Abrams","subject":"chore(gitignore): cover *.bak.* and *.pre-* snapshot patterns","body":"Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"},{"hash":"cd1cf67","date":"2026-05-19 15:14:54 -0700","author":"Steve Abrams","subject":"chore(repo): untrack editor snapshots and broaden gitignore for *.bak.* / *.pre-*","body":"Removes 22 tracked snapshot files (server.js.bak.*, public/index.html.bak.*,\npublic/index.html.pre-*, data/products.json.bak.*) from the index and adds\n*.bak.* + *.pre-* patterns so future on-disk snapshots stay local. Pairs\nwith the .bak/.pre- HTTP 404-guard in server.js.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"},{"hash":"f88113a","date":"2026-05-19 15:14:31 -0700","author":"Steve Abrams","subject":"fix(security): 404-guard for .bak/.pre-* editor snapshots in static root","body":"Stray *.bak/*.bak.*/*.pre-* files under public/ should never be reachable\nvia HTTP. Adds an Express middleware that returns 404 for any path matching\nthose snapshot patterns, so the public static mount can't accidentally\nleak prior revisions of index.html or other pages.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"},{"hash":"f782674","date":"2026-05-19 15:14:14 -0700","author":"Steve Abrams","subject":"fix(api): /api/facets total counts the served niche list, not raw catalog","body":"Previously total reflected pre-niche-filter PRODUCTS.length while the\naesthetics/vendors histograms were computed from PRODUCTS_NICHE; clients\nsaw a \"total\" that didn't match the sum of facet counts.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"},{"hash":"c0aa94c","date":"2026-05-19 12:14:39 -0700","author":"Steve Abrams","subject":"Phase 2b: harden .card .pat against long-token title clipping (overflow-wrap)","body":""},{"hash":"41252b2","date":"2026-05-19 11:23:10 -0700","author":"Steve Abrams","subject":"Phase 2: mobile-ready + tap-to-reveal","body":""},{"hash":"b573903","date":"2026-05-19 10:04:56 -0700","author":"Steve Abrams","subject":"stage2: wire microsite catalog + admin CRUD + grid/list view","body":""},{"hash":"5679179","date":"2026-05-14 08:54:38 -0700","author":"Steve","subject":"hero-4grid: relocate json from data/ to public/ for Express static","body":""},{"hash":"5774b97","date":"2026-05-14 08:48:50 -0700","author":"Steve","subject":"4-grid hero: drop-in script + crop CSS + initial 4 newest products","body":""},{"hash":"616e31a","date":"2026-05-14 08:35:04 -0700","author":"Steve","subject":"favicon: Mag-7-inspired SVG glyph","body":""},{"hash":"9cd36b6","date":"2026-05-13 17:50:05 -0700","author":"Steve","subject":"fix env wiring — anchor dotenv to __dirname so .env loads even when pm2 cwd is wrong","body":""},{"hash":"9cabf1d","date":"2026-05-13 17:42:57 -0700","author":"Steve Abrams","subject":"corner-nav: title-case the brand name even when .ns-name source is lowercase","body":""},{"hash":"cb97b37","date":"2026-05-13 17:41:32 -0700","author":"Steve Abrams","subject":"corner-nav: title-case brand display (e.g. corkwallcovering → Cork Wallcovering)","body":""},{"hash":"4a26fe6","date":"2026-05-13 17:40:53 -0700","author":"Steve Abrams","subject":"corner-nav: fix injection — script tag was landing inside HTML comment, now anchored to real </body>","body":""},{"hash":"bd98dca","date":"2026-05-13 14:46:30 -0700","author":"Steve Abrams","subject":"fix: contact modal CSS+HTML (was rendering inline as raw emoji/links)","body":""},{"hash":"430d914","date":"2026-05-13 14:00:56 -0700","author":"Steve Abrams","subject":"embed Big Red customer chat (lower-left, retail mode, vendor-redacted)","body":""},{"hash":"c279abf","date":"2026-05-13 14:00:01 -0700","author":"Steve Abrams","subject":"chip-click → product details modal; vendor redacted in card overlay","body":""},{"hash":"fd83003","date":"2026-05-13 12:32:46 -0700","author":"Steve Abrams","subject":"add universal corner-nav.js (UR 4-icon: bag/account/search/menu)","body":""},{"hash":"c856c16","date":"2026-05-13 12:13:25 -0700","author":"Steve Abrams","subject":"remove stray contact modal markup that was rendering inline on the page","body":""},{"hash":"e35ced9","date":"2026-05-11 04:10:51 -0700","author":"Steve","subject":"fleet-grid refine: chip_uniform_aspect (retrowalls)","body":""},{"hash":"0f4396b","date":"2026-05-11 04:06:37 -0700","author":"Steve","subject":"snapshot before fleet-grid refine tick 7","body":""},{"hash":"4599216","date":"2026-05-10 12:43:54 -0700","author":"Steve","subject":"sort-skill UI: add Light→Dark / Dark→Light / Color Wheel options","body":""},{"hash":"17996f8","date":"2026-05-10 10:41:49 -0700","author":"Steve","subject":"sort-skill canonical: add light-dark/dark-light/wheel + helpers","body":""},{"hash":"76c1d31","date":"2026-05-10 08:53:00 -0700","author":"Steve","subject":"apply R1+R2+R4 hero standing rules — strip Studio Castel, lowercase serif wordmark below photo, add data-hero-mode huge default + four-square hydration","body":""},{"hash":"1ad1285","date":"2026-05-07 23:04:46 -0700","author":"Steve Abrams","subject":"Scrub Designer Wallcoverings from products.json (vendor/imageAlt/tags)","body":"Replaced literal 'Designer Wallcoverings' (vendor field, imageAlt suffix,\nand tag arrays) with site brand_name. The static HTML was already clean,\nbut Browserbase rendered-page check found these JS-injected strings.\n\nNow: 0 DW leaks rendered.\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"},{"hash":"4cdc2f8","date":"2026-05-07 17:55:01 -0700","author":"Steve","subject":"graphic-loop pass 13: real footer brand + Facebook link + OG/Twitter meta tags","body":""},{"hash":"a99d6b6","date":"2026-05-07 13:19:12 -0700","author":"Steve","subject":"graphic-loop pass 12: niche keyword filter (no off-niche products like 'solid' on patterned sites)","body":""},{"hash":"26fd8af","date":"2026-05-07 12:42:14 -0700","author":"Steve","subject":"graphic-loop pass 11: add Ideas rails (New this week + Curated picks) above main grid","body":""},{"hash":"a49889a","date":"2026-05-07 12:36:48 -0700","author":"Steve","subject":"fix: stale res.json fragment causing SyntaxError","body":""},{"hash":"0397efd","date":"2026-05-07 09:25:17 -0700","author":"Steve","subject":"graphic-loop pass 10: center-mark to top + readable text-shadow + tighter letter-spacing (no mix-blend-mode)","body":""},{"hash":"a461ff2","date":"2026-05-07 09:12:50 -0700","author":"Steve","subject":"graphic-loop pass 9: real site name + 20-image hero rotation + 2400px hero res","body":""},{"hash":"b1f1b62","date":"2026-05-06 21:55:48 -0700","author":"Steve","subject":"graphic-loop pass 5: serif hero typography (Cormorant Garamond) + nav legibility (qwen3 unanimous)","body":""},{"hash":"a565987","date":"2026-05-06 19:59:41 -0700","author":"Steve","subject":"graphic-loop pass 2: fix .corner-mark contrast + soften hero overlay (qwen3:14b consensus across fleet)","body":""},{"hash":"57d4abb","date":"2026-05-06 10:25:46 -0700","author":"Steve Abrams","subject":"initial scaffold (gitify-all 2026-05-06)","body":""}]}