{"slug":"glassbeadedwallpaper","total":18,"limit":100,"offset":0,"since":null,"commits":[{"hash":"8d84b1d","date":"2026-07-03 09:57:40 -0700","author":"Steve Abrams","subject":"corner-nav: move login to its own hamburger in upper-left (panel slides from left)","body":""},{"hash":"5f55c0b","date":"2026-06-17 09:47:04 -0700","author":"Steve Abrams","subject":"leak fix: 404-guard raw catalog json (glass-bead-products.json still served 721 products w/ supplier names) + git-rm the artifact; page uses scrubbed /api/products","body":""},{"hash":"450412b","date":"2026-06-12 09:19:45 -0700","author":"Steve","subject":"code-health: untrack 1.4MB backup json + 404-guard backup/scratch files in static server","body":""},{"hash":"732dc8a","date":"2026-06-01 16:18:32 -0700","author":"Steve","subject":"vendor-redact: scrub DW vendor names from /api/products (raw-http server uses redact() inline; was leaking)","body":""},{"hash":"51d9d40","date":"2026-06-01 14:03:45 -0700","author":"Steve","subject":"fix(hero): replace 404 glass-bead-hero.jpg + glass-bead-logo.png with real high-res BDL_1867 glass-bead texture (hero bg 2000px, og 1200x630 crop, logo 400x400)","body":""},{"hash":"a5f7d52","date":"2026-05-30 23:56:34 -0700","author":"Steve","subject":"gitignore: add backup/orig/old file patterns to prevent source leaks","body":"Added *.bak-*, *.backup.json, *.orig, *.save, *.old patterns.\nglass-bead-products.backup.json (1.3MB Shopify data) is tracked and served\nfrom __dirname root — needs manual rm + git rm to fully remediate.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>"},{"hash":"c1d4d44","date":"2026-05-27 16:34:56 -0700","author":"Steve","subject":"glass: make sort+density controls functional","body":"Two bugs: (1) controls-wiring IIFE ran before #productsGrid was declared so\nthe density slider + sort listener never bound; (2) even if bound, the sort\nchange handler was a /* TODO: re-sort live */ no-op. Fixes: added a generic\nsortProducts(list,mode) (Newest/Color/Style/SKU/Title) + window.applySort()\nthat re-renders from the top, deferred the wiring to DOMContentLoaded, and\nmade loadProducts honor the saved sort (default Newest) instead of always\nsorting by color on load. Both controls remain localStorage-persisted."},{"hash":"19eb646","date":"2026-05-26 09:45:04 -0700","author":"Steve","subject":"redact vendor names from customer-facing /api (close fleet leak)","body":""},{"hash":"fea16fb","date":"2026-05-20 00:27:39 -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":"00e2378","date":"2026-05-19 22:10:26 -0700","author":"Steve Abrams","subject":"add missing .ns-modal CSS — modal HTML existed but had no styles","body":"Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"},{"hash":"f4bc87c","date":"2026-05-19 22:10:26 -0700","author":"Steve Abrams","subject":"add corner-nav.js — universal top-right nav per _shared/corner-nav.js","body":"Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"},{"hash":"52d382e","date":"2026-05-18 20:36:06 -0700","author":"Steve","subject":"Harden static file server against path traversal and malformed URLs","body":""},{"hash":"11aa7e9","date":"2026-05-18 20:35:28 -0700","author":"Steve","subject":"Add rel=noopener noreferrer to external target=_blank links","body":""},{"hash":"fbd15ae","date":"2026-05-11 02:19:56 -0700","author":"Steve Abrams","subject":"snapshot before fleet-grid refine tick 4","body":""},{"hash":"2f653bf","date":"2026-05-10 08:55:47 -0700","author":"Steve","subject":"apply R1+R2+R4 hero standing rules — strip Maison Lustre, lowercase serif wordmark below photo, add data-hero-mode huge default + four-square hydration","body":""},{"hash":"6e696de","date":"2026-05-08 07:35:22 -0700","author":"Steve","subject":"Hamburger always visible on right — propagated from novasuede a815690","body":"Standing rule (~/.claude/skills/dw-site-build/SKILL.md): hamburger ALWAYS\nvisible on the right, inline nav collapses to drop-panel at all widths.\nSame edit as novasuede + silkwallcoverings.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"},{"hash":"afbb31a","date":"2026-05-07 22:58:50 -0700","author":"Steve","subject":"Server-side brand-scrub on /api/products (PG read)","body":"The PG glass_bead_products table still has 'Designer Wallcoverings' in\nvendor/imageAlt/description fields from the original Shopify import.\nAdding a brandScrub() pass on read replaces these with 'Maison Lustre'\nwithout touching the DB. Also flipped /api/products Cache-Control from\nmax-age=60 to no-store so updates propagate immediately past Cloudflare.\n\nBrowserbase render verify: 8 DW leaks → 0.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"},{"hash":"2c23fa0","date":"2026-05-07 20:38:38 -0700","author":"Steve","subject":"initial scaffold + ns-header + Atelier rebrand + sort/density/search controls","body":"47/47 fleet QA (100%) milestone state.\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n"}]}