{"slug":"fabricfriday","total":35,"limit":100,"offset":0,"since":null,"commits":[{"hash":"9e01399","date":"2026-09-10 11:51:21 -0700","author":"Steve Abrams","subject":"Add clean /privacy route (AdSense URL consistency)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"9fb015d","date":"2026-09-10 11:20:48 -0700","author":"Steve Abrams","subject":"Add privacy footer link (AdSense discoverability)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"c55680b","date":"2026-09-10 11:02:05 -0700","author":"Steve Abrams","subject":"Add AdSense-compliant privacy policy page + footer link + /privacy route","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"eac7b24","date":"2026-09-09 16:02:06 -0700","author":"Steve","subject":"TK-11341: add AdSense Auto-Ads loader + ads.txt (revert to remove ads)","body":""},{"hash":"d65efa4","date":"2026-09-04 08:32:30 -0700","author":"Steve Abrams","subject":"deploy: guard live runtime data from rsync --delete","body":"deploy.sh runs 'rsync -az --delete'. This project's server appends\nuser-submitted state to a path inside its own deployed tree, and the file\ndoes not exist locally — so a deploy DELETED it on prod outright.\n\nProven by itemized rsync --dry-run against prod:\n  WITHOUT guard: *deleting   <the runtime file>\n  WITH guard:    (nothing)\n\nProd held real data at the time of the fix: fabricfriday 19,\ntextiletuesday 70, wallpaperwednesday 30 newsletter subscribers.\n\nFound by the new deploy-data-guard-canary, which caught these four after\na hand-rolled sweep missed them. TK-11227.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_013mq9RQtVZZEWvreDqqTgv2"},{"hash":"5ac17bc","date":"2026-08-18 06:06:27 -0700","author":"Steve Abrams","subject":"GA4+Meta pixel: inject gtag + fbq into homepage","body":""},{"hash":"fd70861","date":"2026-08-04 11:44:42 -0700","author":"Steve Abrams","subject":"SEO: rel=nofollow sponsored on designerwallcoverings.com links (independent ranking) [fleet-seo]","body":""},{"hash":"357c28b","date":"2026-08-04 11:27:35 -0700","author":"Steve Abrams","subject":"Wire DW Meta Pixel 1431180262113856 + DW-network ad slot [ads/tracking rollout]","body":""},{"hash":"095ee4a","date":"2026-07-29 22:24:09 -0700","author":"Steve Abrams","subject":"deploy.conf: smoke-check root / (was a /health path these apps don't serve → false-fail)","body":""},{"hash":"77e080d","date":"2026-07-29 09:58:11 -0700","author":"Steve Abrams","subject":"corner-nav: block javascript:/data: URIs in search preview (URL-scheme allowlist)","body":""},{"hash":"e185203","date":"2026-07-29 09:42:41 -0700","author":"Steve Abrams","subject":"corner-nav: live as-you-type search with thumbnail previews (title+tags+description)","body":""},{"hash":"606ae3b","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":"d7b09aa","date":"2026-06-21 17:04:14 -0700","author":"Steve","subject":"deploy: scaffold .deploy.conf for banner deploy","body":""},{"hash":"e2c8214","date":"2026-06-21 16:48:56 -0700","author":"Steve","subject":"banner: wire universal promo-banner require above express.static (officer-approved; deploy gated)","body":""},{"hash":"da15420","date":"2026-06-03 20:45:05 -0700","author":"Steve","subject":"Scrub residual vendor names from products.json (title/vendor/tags); preserve sku/handle","body":""},{"hash":"c82dba1","date":"2026-06-03 20:24:32 -0700","author":"Steve Abrams","subject":"gitignore: add missing standard excludes (.next/)","body":""},{"hash":"592f31c","date":"2026-06-01 16:12:29 -0700","author":"Steve Abrams","subject":"vendor-redact: mount api-vendor-redact middleware (was missing) — scrubs DW vendor names from /api responses per standing rule","body":""},{"hash":"fa2ef35","date":"2026-06-01 15:57:48 -0700","author":"Steve Abrams","subject":"fleet rebuild: dw-header (hamburgers UL + centered name) + unique high-res hero + accent — local branch","body":""},{"hash":"5abc419","date":"2026-06-01 15:47:42 -0700","author":"Steve Abrams","subject":"dw-header: hide ANY pre-existing <header> (not just ns-header); title-case bare-slug names","body":""},{"hash":"53c9b22","date":"2026-06-01 14:49:49 -0700","author":"Steve Abrams","subject":"header A-rebuild: dw-header.js wins fleet — patched to hide original header + corner-nav + v1, fix centered site-name (title fallback), add theme toggle; v1 removed from index","body":""},{"hash":"9979420","date":"2026-06-01 14:22:17 -0700","author":"Steve Abrams","subject":"header: remove dw-header.js — fixes overlapping hamburgers (DW-HAMBURGER-NAV v1 sole nav); fleet regression sweep","body":""},{"hash":"82ed3be","date":"2026-06-01 14:04:03 -0700","author":"Steve Abrams","subject":"fleet rebuild: dw-header (hamburgers UL + centered name) + unique high-res hero + accent — local branch","body":""},{"hash":"60c2122","date":"2026-06-01 13:55:01 -0700","author":"Steve Abrams","subject":"gradient hero (unique hue 99deg) — no niche photography available","body":""},{"hash":"2ed1995","date":"2026-06-01 13:53:03 -0700","author":"Steve Abrams","subject":"gradient hero (unique hue 99deg) — no niche photography available","body":""},{"hash":"05022f4","date":"2026-06-01 13:47:36 -0700","author":"Steve Abrams","subject":"fleet rebuild (header-only): dw-header (hamburgers UL + centered name) + accent — local branch","body":""},{"hash":"cea359b","date":"2026-06-01 07:23:35 -0700","author":"Steve Abrams","subject":"scrub Lee Jofa vendor name from hero copy + product cards","body":""},{"hash":"e4c28b5","date":"2026-05-30 21:40:06 -0700","author":"Steve","subject":"scrub vendor leaks from weekly-feature products.json (hero+archive vendor/subtitle; per sku-redact denylist; DW house brands preserved)","body":""},{"hash":"300fc4b","date":"2026-05-29 13:20:41 -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":"03c7e41","date":"2026-05-26 10:17:01 -0700","author":"Steve","subject":"Embed _shared/corner-nav.js (logo UL + hamburger UR) on front page","body":""},{"hash":"ab76fe7","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":"e8ae740","date":"2026-05-19 17:20:30 -0700","author":"Steve Abrams","subject":"gitignore snapshot files + 404-guard backup paths from static root","body":"Broadens .gitignore to cover *.bak / *.bak.* / *.pre-* / *.orig / *.rej\n/ *~ so accidental snapshot files can never sneak into a commit. Adds\nan Express middleware ahead of express.static that returns 404 for any\nURL matching those extensions, so a stray backup that lands on disk in\npublic/ still can't leak over HTTP.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"},{"hash":"ae203c7","date":"2026-05-19 17:19:54 -0700","author":"Steve Abrams","subject":"add rel=\"noreferrer\" to all target=\"_blank\" external links","body":"Pairs noreferrer with the existing noopener on the four DW outbound\nlinks (header Shop DW, hero CTA, footer Shop DW + Trade Program) and on\nthe JS-generated archive cards so referer headers don't leak.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"},{"hash":"cacc636","date":"2026-05-10 21:40:37 -0700","author":"Steve Abrams","subject":"hamburger nav: apply canonical pattern from sister-site fleet","body":""},{"hash":"e860975","date":"2026-05-10 21:39:52 -0700","author":"Steve Abrams","subject":"snapshot before hamburger nav rollout","body":""},{"hash":"9f391d6","date":"2026-05-07 16:41:31 -0700","author":"Steve Abrams","subject":"initial scaffold: fabricfriday.com cinematic saffron site","body":""}]}