Dw Domain Fleet
Search the build
-
2cb23f32026-07-27 migrate GoDaddy auth → Bearer PAT (TK-10 key rotation); sso-key fallback retained -
7b1c3042026-07-06 Square fleet card images (aspect-ratio 1/1) -
4936c4d2026-06-20 Add Tier-A promo-banner desktop verification screenshot from prior run -
e0e0d832026-06-19 Tier A promo strip: text-only rotating 'New · <product> →' new-arrivals banner across the 44 multitenant DW sites (promoStrip() in render.js, per-site cfg.promoBanner default on); verified live on carmelwallpaper -
1b277d82026-06-09 snapshot before task-52 verification (standalone hero allocation data drift) -
45f2fce2026-06-03 fix(fleet): route scrubTags through canonical isVendorTag + extend scrubVendor denylist — kills dwf vendor tag-chip + slug leaks (Anna French, Christian Lacroix, Ralph Lauren, AS Creation, Gaston Y Daniela, etc); verified 0 vendor names in barwallpaper DOM across 3267 products -
bd7303f2026-06-03 Vendor-neutral image proxy: render emits /img/<token>, server.js streams CDN bytes (closed proxy + LRU). Kills image_url vendor-name leak in card/PDP/hero/JSON-LD. DTD-A. Proven local: 0 leaks, /img 200. -
7c6386c2026-06-01 Per-site catalog extras overlay (data/extras/<slug>.json) — site-exclusive products w/ buy_url, no flagship-store write, survives pull-catalog. For asseeninla LA-toile line. -
251f9082026-06-01 fleet-heroes: fix spurious exit-1 in deploy mode + dedup by slug (don't re-churn same-site www+repo pairs) -
6c986ea2026-06-01 fleet-heroes: open DW fleet registry viewer (:9774) on launch (FLEET_HEROES_NO_OPEN to suppress) -
addb71d2026-06-01 Add fleet-heroes.sh driver: repeatable fleet-wide hero refresh + global dedupe (report-only default, --deploy gated, batched reload) -
c0691682026-06-01 fix: app.set('trust proxy', 1) — resolves ERR_ERL_UNEXPECTED_X_FORWARDED_FOR across all 9 dwf-* apps behind nginx -
10970b92026-06-01 Standalone hero apply + size-vetted retry scripts (prod-side); de-collide 2 content-site lead heroes -
d7527ba2026-06-01 Standalone sister-site unique hero allocation (59 sites, 0 dup, 0 generic-overlap) -
5d250af2026-06-01 Honor prior bleachfriendly drop (domain not renewing): remove re-added config, regen 43-site manifest -
79bf34f2026-06-01 Add bleachfriendly to fleet config + regen 44-site hero manifest (352/352 unique) -
52573cc2026-06-01 Unique clean heroes per site: global disjoint hero-allocation manifest -
8b660a02026-06-01 drop bleachfriendly from fleet (domain not renewing): remove gen-configs spec+name, manifest entry, pm2 app, site config + local nginx conf -
3b766552026-05-31 audit: read-only all-sites vendor-href leak re-verify — fleet STILL leaks (259, a85eb02 undeployed); 3 standalones clean -
7fd25ca2026-05-31 audit: standalone storefronts outbound-href vendor leak (cdm/carmel/ntw all leak via buy-CTA+anchor, deploy Steve-gated) -
a85eb022026-05-31 render: route PDP buy CTA + main-store anchor + canonical through clean slug (kills vendor-handle DOM leak) -
49997ea2026-05-31 Add sort <select> + density control bar to dwf homepage Featured grid (standing-rule compliance, client-side sort, shared localStorage with /catalog) -
55a7f0b2026-05-31 Add 2026-05-31 read-only vendor-leak re-verify: slug/chip scrub holds 0; outbound DW-store href leaks 594 across 43 sites -
1bdbba02026-05-30 scrubVendor: optional inter-token separator ([^a-z0-9]*) catches no-separator handle spellings (wolfgordon, gpjbaker) + add 'g p j baker' per-initial variant + collapse mid-handle residue. Closes the 936 wolfgordon URL-slug leaks (#3 morning digest). Export scrubVendor for tests -
0ac4d912026-05-30 render.js productSlug: guard both slug returns with hasVendorToken() — closes the 936 residual URL-slug leaks (935 wolfgordon + 1 gpjbaker) the separator-requiring scrubVendor regex missed on CONCATENATED handle spellings (wolfgordonwallcovering) + per-initial splits (g-p-j-baker). Falls back to clean scrubbed-sku/hash slug. Normal products unaffected; route still dual-key resolves old URLs. -
5aee3552026-05-29 Close C: 'A is enough' (Steve 2026-05-29). Source handle rename rejected — blind detection can't tell vendor 'Harlequin' from 'harlequin' pattern / house-brand products; would corrupt live canonical URLs. Shipped render-time scrub (A) is the fix -
56504de2026-05-29 render.js+server.js: eliminate data-handle/data-sku DOM vendor leak via clean-slug + /buy/:slug server-side redirect (DTD verdict B), reconciled on top of verdict-A slug-cleaning -
a2b73c42026-05-29 Park C (vendor handle source-rename) plan — DTD verdict A's durable follow-up; gated, awaiting Steve go on a Shopify+dw_unified handle migration -
52a5b402026-05-29 render.js productSlug: when the whole handle is a vendor name (e.g. brunschwig-fils), fall back to scrubbed-sku or a deterministic hash slug instead of the raw handle — closes the last 4 URL leaks (DTD verdict A) -
9450ca42026-05-29 render.js scrubVendor: fix regex builder (split on non-alnum + drop empty tokens — was mangling 'brunschwig & fils' → '-fils' residue) + add slug variants cole-son/caroline-cecil/clarke-clarke/morris-co so /product hrefs are fully vendor-clean (DTD verdict A) -
09c24d72026-05-29 render.js: scrubVendor() removes vendor names from displayed title + card-meta sku + /product slug + productPage h1/sku (fleet vendor-leak fix, 2026-05-29 audit). Link-safe: data-handle/data-sku raw, route resolves clean-slug OR raw-handle, DW-store CTA uses raw handle -
ee30c6a2026-05-29 fix: strip 3rd-party vendor tokens from product slug/handle in fleet UI (redactVendorSlug) — closes the slug-level vendor leak across the dwf fleet that the 2026-05-28 chip scrub missed; route-safe (server.js resolves via productSlug(x)===key + real-handle fallback) -
34fbe0e2026-05-29 fix(fleet pdp): toggle hidden until ?theme=N opt-in -
453b0002026-05-29 feat(fleet pdp): theme1/theme2 toggle via ?theme=N query-param gate -
661cbec2026-05-28 shared/render.js: scrub head-baked vendor from product titles (audit 2026-05-28 task#53 addendum). scrubTags closed the tag-chip leak; titles like 'Versace 4 Metallic Wallcovering' still leaked the vendor via card-title + data-title (→ quick-view modal title + aria-label) + productPage <h1>/<title>/og:title. Add scrubTitleLead() (denylist-driven leading-vendor stripper, mirrors stripLeadVendor in _shared/api-vendor-redact.js but on THIS file's VENDORS_DENYLIST so chip+title stay on one list) + displayTitle() helper used by both card() and productPage() so the two derivations stay identical. House-brand-led names preserved; empty/generic remainder falls back to 'Designer Wallcovering'. CANARY-verified on designermagnetics.com (526 products): /catalog + /product visible-text vendor hits 0 (was: Versace in card-title+data-title), 0 empty/mangled titles, house brand preserved 67x. NOT DEPLOYED — follow-up tick fans out deploy + fleet-wide rendered-DOM re-verify per drift-aware plan. -
82e09682026-05-28 shared/render.js: scrub vendor names from tag-chips fleet-wide (closes audit 2026-05-28 task#53 HIGH finding). Add scrubTags() helper with 47-vendor denylist (mirrors _shared/sku-redact.js + adds Kravet, de Gournay, Romo, Farrow & Ball, Colefax & Fowler, Sanderson, Morris & Co, Osborne & Little — all surfaced by the audit or missing from the prior denylist). Apply at both leak points: card data-tags attribute (feeds quick-view modal chips) + productPage <span> chip strip. Verified: 7 audit-leaked vendors filtered (Brunschwig & Fils, Kravet, Schumacher, Maya Romanoff, Lee Jofa, de Gournay, Romo), house brands preserved (Designer Wallcoverings, Hollywood). NOT YET DEPLOYED — awaiting Steve sign-off + drift-aware deploy plan. -
af735a72026-05-28 shared/render.js: reconcile prod drift — pull equalize toolbar markup (ctl-sort + ctl-density flex wrappers + space-between + range/search flex constraints) back into Mac2 source after directly-on-prod shipping earlier today. Mac2's card-hover-effect (aa83057) preserved untouched. Hashes now align on the equalize feature; only card-hover (4 CSS + 1 HTML line) remains Mac2-ahead. -
aa830572026-05-28 shared/render.js: universal hover-preview — stamp --card-bg on card-img inline style + ::after pseudo-element shows 3×3 tile-repeat of the same image on :hover (reveals the seamless pattern structure). One edit applies to all 44 sister sites in dw-domain-fleet/sites/ on next restart. prefers-reduced-motion guarded. -
1e6fa792026-05-19 catalog: hydrate sort dropdown + density slider from localStorage before first paint -
febdfbc2026-05-19 chore: broaden .gitignore — snapshot/editor cruft (*.bak, *.orig, *.rej, *.swp, *~, *.pre-*) -
46abc9e2026-05-19 feat: clean fleet /product/ slugs — productSlug() strips 'wallpaper'; handle kept verbatim for Shopify canonical+sample; dual-key route resolves old+new URLs -
50040302026-05-19 fix: restore lost pattern name on 4 William Morris products (Fruit | William Morris) -
2481a302026-05-19 fix: theme toggle occluded by hamburger (now fixed-position z-101 left of menu); blank-title fallback to SKU for malformed catalog rows -
d0f30c22026-05-19 DNS cutover batches 4-5 complete (idx 27-43): 44/44 fleet HTTPS verified -
8b735672026-05-19 DNS cutover batch 5 (idx 36-43): 8/8 live HTTPS 200 — fleet cutover complete 44/44 -
26f2aef2026-05-19 Add /info page, trim navpanel to 4 items, sun/moon theme toggle -
40eaabd2026-05-19 DNS cutover batch 4 (idx 27-35): 9/9 live HTTPS 200 -
1e65c592026-05-19 DNS cutover batch 3 (idx 18-26): SSL+HTTPS verified -
cfc34cd2026-05-19 DNS cutover batch 3 (idx 18-26): 9/9 live HTTPS 200 -
f84402b2026-05-19 DNS cutover batch 2 (idx 9-17): 9/9 live HTTPS 200 -
42bb3e22026-05-19 DNS cutover batch 1 (idx 0-8): 9/9 live HTTPS 200 + nginx blocker resolved -
b9e4a692026-05-19 fleet: DEPLOY+SMOKE phase — 44/44 deployed to Kamatera, all online ports 10001-10044, 44/44 origin smoke pass; log nginx typo-redirect-1800wallcoverings conflict blocker -
b57956d2026-05-18 fleet: STEP 2 — re-port fleet-44 to 10001-10044 (clear collision with sister sites on 9901-9944); regenerate ecosystem + nginx + sync site config ports; 44/44 boot-test pass -
21865622026-05-18 fleet: SCOPE CORRECTION 66→44 (dtd Option B split) — 22 domains stay 301 redirects; add asseeninmovies; product pages with rel=canonical→main store + per-site title/meta; crawlable card links -
32e95f92026-05-18 fleet: DNS cutover + SSL + deploy scripts, PROGRESS.md -
d1bbf072026-05-18 fleet: explicit display-name overrides, ecosystem + nginx generators, boot-test (65/65 pass) -
fb983c12026-05-18 dw-domain-fleet: shared parameterized microsite server + 65 site configs; grasscloth exemplar verified locally
Authors
- Steve56
- steve1
Agents used
Skills used
- /info7
- /render5
- /catalog4
- /product4
- /data-sku2
- /buy2
- /theme22
- /hero1
- /extras1
- /gen-standalone-heroes1
- /gen-hero-allocation1
- /hero-allocation1
- /carmel1
- /ntw1
- /chip1
- /hash1
- /caroline-cecil1
- /clarke-clarke1
- /morris-co1
- /sku1
- /handle1
- /api-vendor-redact1
- /generic1
- /mangled1
- /sku-redact1
- /search1
- /sites1
- /editor1
- /moon1
- /about1
Creative ideas + design notes
d7527ba · 2026-06-01 · Standalone sister-site unique hero allocation (59 sites, 0 dup, 0 generic-overlap)
59 standalone storefronts served only 14 distinct static hero-bg.jpg files (31 shared one 1.9MB template image). scripts/gen-standalone-heroes.js assigns each a unique, clean, niche-relevant catalog image, disjoint from the 344 generic heroes and each other. Deploy replaces the 51 duplicate-cluster files; 8 already-unique heroes preserved.
5d250af · 2026-06-01 · Honor prior bleachfriendly drop (domain not renewing): remove re-added config, regen 43-site manifest
Reverts the accidental re-add in 79bf34f. bleachfriendly.com serves a static hero and its domain is lapsing per 8b660a0; it does not belong in the rotating hero fleet. Prod's live 43 active template sites are already verified unique.
52573cc · 2026-06-01 · Unique clean heroes per site: global disjoint hero-allocation manifest
Every generic-fleet site previously derived its hero from the same newest-niche slice; thin-niche sites fell back to the shared all-wallcovering pool, so 18+ sites rendered the identical lead image (43 sites used only 67 unique images across 344 hero slots). scripts/gen-hero-allocation.js now precomputes data/hero-allocation.json — a globally-disjoint, niche-relevant, clean (https, non-swatch) set of 8 heroes per site, distinct base patterns within each rotation. server.js reads it. Result: 344/344 hero slots unique, zero cross-site duplicates.
56504de · 2026-05-29 · render.js+server.js: eliminate data-handle/data-sku DOM vendor leak via clean-slug + /buy/:slug server-side redirect (DTD verdict B), reconciled on top of verdict-A slug-cleaning
data-handle + data-sku now carry the vendor-free productSlug instead of the raw Shopify handle; the quick-view buy-sample CTA links to the fleet's own /buy/:slug route, which resolves the real handle server-side and 302-redirects to the DW store — so the raw vendor-laden handle never reaches the rendered DOM. Folds in the parallel session's productSlug \s+ re-hyphenate refinement (verdict A). Closed redirect: target host hardcoded, slug validated, 404 on miss. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
34fbe0e · 2026-05-29 · fix(fleet pdp): toggle hidden until ?theme=N opt-in
Prior version always set data-page-theme attribute even for default visitors, defeating the gate. Now: no opt-in → attribute unset, toggle display:none. Opt-in via URL or localStorage → attribute set, toggle becomes inline-flex.
453b000 · 2026-05-29 · feat(fleet pdp): theme1/theme2 toggle via ?theme=N query-param gate
Adds the same theme1/theme2 preview surface to all 44 dwf-* product pages via the shared productPage() template. Since dw-domain-fleet has no admin auth, gate is by URL query param (?theme=2 → flip to theme2, persisted in localStorage 'wallco-page-theme'). Toggle UI is hidden until theme2 mode is active so default visitors see vanilla theme1.
1e6fa79 · 2026-05-19 · catalog: hydrate sort dropdown + density slider from localStorage before first paint
Density already read its saved value but the apply() races the initial --cols:5 emitted in CSS, so users with a saved density saw a brief flash. Add a clear "before first paint" comment to lock the ordering. Sort dropdown was write-only — change events persisted to localStorage but a fresh /catalog visit always rendered with the server's selected="newest". Now, when the URL has no ?sort= override, the dropdown hydrates from localStorage (validated against the known option set) so the user's last choice surfaces. The form still posts ?sort=<value> on next change so the server-rendered list matches what the dropdown shows. Pure client-side; catalog query, sortProducts, and product resolution untouched. Fleet-wide change since render.js is the shared template for all 44 sites. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
26f2aef · 2026-05-19 · Add /info page, trim navpanel to 4 items, sun/moon theme toggle
TASK 1: New per-site /info page (infoPage in shared/render.js + /info route in server.js) — Memo Samples, Trade Program, Shipping & Lead Times, FAQ. cfg-driven, no vendor names, no banned 'wallpaper' word, rel=canonical to the site's own /info. TASK 2: Navpanel now exactly 4 items — Designs, About, Info, Contact. TASK 3: Theme toggle shows a sun in light mode, moon in dark mode — both SVGs in the button, swapped via CSS keyed on html[data-theme=dark], no JS change so it survives the anti-flash inline script. Verified: node -c passes both files; grassclothwallcovering booted on :10999 — /, /info, /about, /catalog all 200; /info renders all 4 sections; nav shows the 4 items; no 'wallpaper' in /info copy. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
File tree
- .gitignore
- PROGRESS.md
- VENDOR_HANDLE_RENAME_PLAN.md
- data/catalog.json
- data/hero-allocation.json
- data/manifest.json
- data/nginx/1800wallcoverings.com.conf
- data/nginx/asseeninhotels.com.conf
- data/nginx/asseeninla.com.conf
- data/nginx/asseeninmovies.com.conf
- data/nginx/asseeninshowrooms.com.conf
- data/nginx/barwallpaper.com.conf
- data/nginx/blankstocklining.com.conf
- data/nginx/carmelwallpaper.com.conf
- data/nginx/cfafabrics.com.conf
- data/nginx/classawallcovering.com.conf
- data/nginx/commercialsalesreps.com.conf
- data/nginx/commercialwallcovering.com.conf
- data/nginx/designermagnetics.com.conf
- data/nginx/etciemurals.com.conf
- data/nginx/fabricfridays.com.conf
- data/nginx/fireratedwallcovering.com.conf
- data/nginx/flocked.org.conf
- data/nginx/grassclothwallcovering.com.conf
- data/nginx/handmadewallcovering.com.conf
- data/nginx/hollywoodwallcovering.com.conf
- data/nginx/hospitalitysalesagency.com.conf
- data/nginx/malibuwallpaper.com.conf
- data/nginx/montereywallpaper.com.conf
- data/nginx/naturalwalltextures.com.conf
- data/nginx/patterndesignlab.com.conf
- data/nginx/philliperomano.com.conf
- data/nginx/printmurals.com.conf
- data/nginx/restaurantfabrics.com.conf
- data/nginx/restaurantmurals.com.conf
- data/nginx/roomsettings.com.conf
- data/nginx/sheltermagazines.com.conf
- data/nginx/specifywallpaper.com.conf
- data/nginx/stevenabramsphotography.com.conf
- data/nginx/thehotelwallpaper.com.conf
- data/nginx/traditionalwhimsy.com.conf
- data/nginx/unitedstateswallpaper.com.conf
- data/nginx/wallcovering.net.conf
- data/nginx/wallpaperexports.com.conf
- data/nginx/wallpaperfromthe80s.com.conf
- data/nginx/wallpaperny.com.conf
- data/nginx/wallpaperpurchasing.com.conf
- data/nginx/wallpaperweekly.com.conf
- data/nginx/wc01wallcoverings.com.conf
- data/retry-candidates.json
- data/standalone-hero-allocation.json
- data/standalone-hero-paths.tsv
- ecosystem.config.js
- output/fleet-vendor-leak-reverify-2026-05-31.md
- output/leak-reverify-checker.js
- output/leak-reverify-raw.json
- output/promo-desktop.png
- output/standalone-outbound-href-audit-2026-05-31.md
- output/vendor-leak-allsites-reverify-2026-06-01.md
- package-lock.json
- package.json
- scripts/apply-retry.js
- scripts/apply-standalone-heroes.js
- scripts/boot-test.js
- scripts/deploy-fleet.sh
- scripts/dns-cutover.js
- scripts/fleet-heroes.sh
- scripts/gen-configs.js
- scripts/gen-ecosystem.js
- scripts/gen-hero-allocation.js
- scripts/gen-nginx.js
- scripts/gen-retry-candidates.js
- scripts/gen-standalone-heroes.js
- scripts/provision-ssl.sh
- scripts/pull-catalog.js
- server.js
- shared/catalog.js
- shared/render.js
- shared/sort.js
- sites/1800wallcoverings.json
- sites/asseeninhotels.json
- sites/asseeninla.json
- sites/asseeninmovies.json
- sites/asseeninshowrooms.json
- sites/barwallpaper.json
- sites/blankstocklining.json
- sites/carmelwallpaper.json
- sites/cfafabrics.json
- sites/classawallcovering.json
- sites/commercialsalesreps.json
- sites/commercialwallcovering.json
- sites/designermagnetics.json
- sites/etciemurals.json
- sites/fabricfridays.json
- sites/fireratedwallcovering.json
- sites/flocked.json
- sites/grassclothwallcovering.json
- sites/handmadewallcovering.json
- sites/hollywoodwallcovering.json
- sites/hospitalitysalesagency.json
- sites/malibuwallpaper.json
- sites/montereywallpaper.json
- sites/naturalwalltextures.json
- sites/patterndesignlab.json
- sites/philliperomano.json
- sites/printmurals.json
- sites/restaurantfabrics.json
- sites/restaurantmurals.json
- sites/roomsettings.json
- sites/sheltermagazines.json
- sites/specifywallpaper.json
- sites/stevenabramsphotography.json
- sites/thehotelwallpaper.json
- sites/traditionalwhimsy.json
- sites/unitedstateswallpaper.json
- sites/wallcovering.json
- sites/wallpaperexports.json
- sites/wallpaperfromthe80s.json
- sites/wallpaperny.json
- sites/wallpaperpurchasing.json
- sites/wallpaperweekly.json
- sites/wc01wallcoverings.json