{"slug":"dw-fleet-registry","total":44,"limit":100,"offset":0,"since":null,"commits":[{"hash":"ba7d3db","date":"2026-07-03 08:07:58 -0700","author":"Steve","subject":"chore: macstudio3 migration — reconcile from mac2 + repoint paths (stevestudio2→macstudio3, node/npm/npx→/opt/homebrew)","body":""},{"hash":"18b7545","date":"2026-06-01 16:36:36 -0700","author":"SteveStudio2","subject":"deploy: ssh mkdir -p prod rooms/ before rsync (local openrsync lacks --mkpath)","body":"Fixes hero-pool deploy failing when prod public/rooms/ didn't exist. Deployed all 45\nstaged sites live (45/45, 0 failures); verified rotateHero v2 paints the room heroes\nin production.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"a6f39b4","date":"2026-06-01 16:29:18 -0700","author":"SteveStudio2","subject":"livefleet viewer: add fleet Sign out (SSO logout) link","body":""},{"hash":"feeb059","date":"2026-06-01 16:24:47 -0700","author":"SteveStudio2","subject":"rooms: niche-matched pattern picker + regen (fixes off-niche/sample-crop heroes)","body":"Picks each site's wall pattern by domain-niche keyword + non-sample preference instead\nof the newest product. Regenerates only sites where the pattern actually changes (cost-\nminimal). Re-ran 17/45: era sites get period patterns (1950s vintage utensils, 1960s\ngeometric), chinoiserie gets real bamboo trellis vs a sample crop, jute gets actual jute.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"8a74fdf","date":"2026-06-01 16:05:04 -0700","author":"SteveStudio2","subject":"rooms: batch generator (all standalone sites) + deploy pushes staged room PNGs","body":"batch-gen-rooms.mjs: per-site fetch top product as pattern -> 3 rooms via :3075 -> 2x\nupscale -> stage /static/rooms/<domain>/. Redirect + NOPAT guards. Deploy endpoint now\nrsyncs staged room PNGs to prod public/rooms/ and rewrites pool URLs to live https.\nBatch: 45 sites / 133 rooms staged (~$5.30). gitignores heavy PNG artifacts.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"d2901dc","date":"2026-06-01 15:59:11 -0700","author":"Steve Abrams","subject":"re-assign heroes from 3526-img pool: 33 room settings (was 12) + 32 patterns, 65/65 unique 0 dupes","body":""},{"hash":"a45e546","date":"2026-06-01 15:52:21 -0700","author":"Steve Abrams","subject":"full 65-site header certification results","body":""},{"hash":"ab9e050","date":"2026-06-01 15:51:15 -0700","author":"SteveStudio2","subject":"rooms: gen-hero-rooms.mjs (generate room-setting heroes via :3075 + 2x upscale)","body":"Reusable pilot pipeline: pattern URL -> Gemini room render (~$0.04) -> sips 2x upscale to\n~1728px (clears the 1400px hero guard). Verified on corkwallcovering (3 rooms, luxe quality).\ngitignores the heavy PNG artifacts. Also lands the user's viewer sharp/thumbSrc edits.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"f1cf338","date":"2026-06-01 15:48:51 -0700","author":"SteveStudio2","subject":"fleet viewer: proxy-side image resize via optional sharp (/img?w=) — caps non-Shopify heroes to webp; sharp is an optionalDependency w/ graceful fallback","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"af278f4","date":"2026-06-01 15:48:36 -0700","author":"Steve Abrams","subject":"dw-header: hide ANY pre-existing <header> + propagate to fleet; verified 11 sites render new header public-mode","body":""},{"hash":"2cf8354","date":"2026-06-01 15:45:02 -0700","author":"Steve Abrams","subject":"fix-header-inject: re-inject dw-header before real </body> (was trapped in a doc-comment on 51/65 sites → header rebuild was inert)","body":""},{"hash":"c4ca891","date":"2026-06-01 15:40:40 -0700","author":"SteveStudio2","subject":"library: harvest full Shopify image arrays + room/pattern/swatch tagging; picker Rooms filter","body":"harvest-catalog v2: long-edge>=1600/short>=1100 (catches landscape room shots), classifies\neach image room|pattern|swatch by filename, sorts room-first. 467 imgs (49 room/360 pattern/\n58 swatch) vs 265 before. /api/image-library gains kind+landscape; picker modal adds a\n'Rooms only' dropdown + 🛋 badge. Note: catalog room shots are all Sister Parish lifestyle —\ntrue per-niche interiors need room-setting-generator.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"389f621","date":"2026-06-01 15:37:00 -0700","author":"SteveStudio2","subject":"fleet viewer: downsize grid thumbnails (Shopify width param) — saved hero stays full-res","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"e53dc97","date":"2026-06-01 15:28:33 -0700","author":"SteveStudio2","subject":"viewer: deploy curated hero pools live (hero-pool.json rsync to prod)","body":"Adds /api/hero-pool/deploy (writes repo public/hero-pool.json + rsync to prod cwd,\nstatic so no reload) and a 'Save & deploy live' modal button. Persists slug->cwd->repo\nmap in data/deploy-map.json (69 sites). Full loop verified on 1950swallpaper:\npick hi-res -> save -> deploy -> rotateHero rotates the pool (primary 5773px).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"706726c","date":"2026-06-01 15:19:31 -0700","author":"SteveStudio2","subject":"viewer: hero-pool picker — pick high-res images to rotate per site","body":"Adds /api/image-library (265-img catalog-hires pool, highest-res first, searchable),\n/api/hero-pool GET + /set. New ⊞ per-card button opens a modal: left = ordered\nrotation pool (drag-reorder, remove, sort-by-resolution, top=primary), right =\nhigh-res library grid (click to add/remove, shows WxH). Saves heroImages[] to the\nregistry; heroImage = pool[0]. Pairs with the live rotateHero v2 (hero-pool.json).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"8a825a8","date":"2026-06-01 15:12:13 -0700","author":"Steve Abrams","subject":"normalize header names → domain name across 53 sites (remove odd brand names like Studio Castel)","body":""},{"hash":"2df70d0","date":"2026-06-01 15:11:33 -0700","author":"SteveStudio2","subject":"fleet viewer: make hero drop zone the whole card, not just the chip","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"14428b6","date":"2026-06-01 15:07:47 -0700","author":"SteveStudio2","subject":"viewer: harden rescrape single-flight against client disconnect","body":"reply-once helper resets the flag + guards send() on a destroyed socket, plus a\n5-min safety timeout — a short client timeout can no longer wedge the button or\ncrash the server (was hitting EADDRINUSE + stuck 409).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"4ab8683","date":"2026-06-01 15:05:49 -0700","author":"SteveStudio2","subject":"viewer: add 'Rescrape heroes (all)' button → POST /api/rescrape-heroes","body":"Re-scrapes every site's live hero page and re-bakes heroes via resolve-heroes.mjs\n(no live-status probe, unlike Re-probe). Single-flight guarded — concurrent click 409s.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"30cf448","date":"2026-06-01 15:01:35 -0700","author":"SteveStudio2","subject":"fleet: 5 parked domains live + unique heroes; rebake clears last dup cluster","body":"bestwallpaperplace/wallpaperestimator/wallpaperdistributors/hospitalitydesignreps/wallpapercontractor\nrepointed GoDaddy A @+www to Kamatera, certbot SSL, unique og:image hero each.\nRegistry rebake: 0 effective visible dup clusters, 117 distinct heroes baked.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"6253b68","date":"2026-06-01 14:49:39 -0700","author":"Steve Abrams","subject":"fix deploy phase: brace-delimit ${BRANCH} (set -u choked on $BRANCH hugging a multibyte arrow)","body":""},{"hash":"9f6548c","date":"2026-06-01 14:48:49 -0700","author":"Steve Abrams","subject":"rotate-and-deploy.sh — phased one-command driver (route/kamatera/unfreeze/deploy), dry-run default, no auto-chain","body":""},{"hash":"ffa5ab5","date":"2026-06-01 14:19:13 -0700","author":"SteveStudio2","subject":"fleet hero/ideas transform tool + deploy","body":""},{"hash":"4e12b31","date":"2026-06-01 14:19:02 -0700","author":"SteveStudio2","subject":"fleet hero/ideas transform tool","body":""},{"hash":"6006e2f","date":"2026-06-01 14:11:37 -0700","author":"Steve Abrams","subject":"disable-grid sweep: 44 hero-4grid overlays off so unique high-res heroes show full-bleed (1 known residual: PANEL-grid variant on a few sites)","body":""},{"hash":"0e3363a","date":"2026-06-01 14:07:22 -0700","author":"SteveStudio2","subject":"viewer: proxy cross-origin hero images through /img — fleet microsites send CORP same-origin (helmet default) which blocked direct <img> hotlinking, leaving ~30 self-hosted hero-bg.jpg cards blank. Now 118/118 render","body":""},{"hash":"f5aaaa0","date":"2026-06-01 14:06:05 -0700","author":"Steve Abrams","subject":"heroes = truly-high-res: 12 real Shopify room settings (niche-matched) + high-res patterns elsewhere; gradients removed; 65/65 unique, 0 dupes","body":""},{"hash":"e0e5737","date":"2026-06-01 13:59:22 -0700","author":"SteveStudio2","subject":"heroes: every site gets a DISTINCT high-res image — pull from /api/products + local catalogs, greedy unique assignment (owner keeps styled hero, cousins get own product img), branded fallback for 5 imageless pages. 0 blanks, 0 dups, 114 distinct URLs","body":""},{"hash":"aa6a541","date":"2026-06-01 13:55:45 -0700","author":"Steve Abrams","subject":"close out fleet: header-only on 24, niche-search heroes for 7, unique gradient heroes for 17; 65/65 sites have header + a UNIQUE hero (0 dupes)","body":""},{"hash":"a8abc42","date":"2026-06-01 13:53:34 -0700","author":"SteveStudio2","subject":"gap-fill: 13 niche-starved microsites get a unique high-res hero (any-unused pool fallback, fleet-deduped) — closes the hero-dup gap to 61/62 (thesetdecorator excluded by design)","body":""},{"hash":"a6469f0","date":"2026-06-01 13:44:13 -0700","author":"Steve Abrams","subject":"full-fleet fan-out: 41/65 sites rebuilt (header + unique high-res niche hero + accent), 0 fail; 24 skipped (niche has no unused high-res match in 241-img pool)","body":""},{"hash":"4204905","date":"2026-06-01 13:41:56 -0700","author":"SteveStudio2","subject":"viewer: pre-resolve+validate hero images into registry, render baked heroes directly (no 118-fetch storm) — 110/118 paint instantly; reprobe re-bakes","body":""},{"hash":"6392f46","date":"2026-06-01 13:40:36 -0700","author":"SteveStudio2","subject":"viewer: 'Hide redirect dupes' toggle (default on) — folds 6 near-dup redirect domains into their canonical card with a +N alias badge","body":""},{"hash":"80203d0","date":"2026-06-01 13:34:20 -0700","author":"Steve Abrams","subject":"fleet fan-out engine + hero ledger: 4 sites rebuilt (jute+metallic+mylar+wallpapersback), 3 skipped (no high-res hero in slice)","body":""},{"hash":"d8d6629","date":"2026-06-01 13:20:39 -0700","author":"Steve Abrams","subject":"reusable dw-header.js drop-in: hamburgers UL (nav + admin) + centered name, configurable per-site (siteName/accent/navLinks/adminLinks), admin-reveal stub; + hero-dup audit (50 files, only 14 unique)","body":""},{"hash":"e2ab0c2","date":"2026-06-01 13:15:59 -0700","author":"SteveStudio2","subject":"fix(grasscloth board): dark --muted/--rule on white ground so tagline, captions, footer + hairlines are visible (were white-on-white)","body":""},{"hash":"8886e66","date":"2026-06-01 13:08:14 -0700","author":"Steve Abrams","subject":"read-only template-drift audit: 37 mapped sites vs assigned fashion templates (30 match, 7 drift)","body":""},{"hash":"41cdb66","date":"2026-06-01 12:59:37 -0700","author":"Steve Abrams","subject":"live-data boards: scrape theme tokens from served CSS + embed real hero photos (download same-origin so Figma capture serializes them); validate hero URLs vs 404s","body":""},{"hash":"bf16606","date":"2026-06-01 12:46:27 -0700","author":"Steve Abrams","subject":"live fleet viewer (:9774) — 119 cards, live og:image thumbs + status, per-site theme accents, sort+density; carry theme tokens in registry","body":""},{"hash":"e71047d","date":"2026-06-01 12:43:09 -0700","author":"Steve Abrams","subject":"hybrid brand demo: 3 per-site boards themed from real style-guide tokens (gilt/bodoni, coastal/cormorant, plum/playfair), captured to Figma","body":""},{"hash":"efc57ba","date":"2026-06-01 12:33:44 -0700","author":"Steve Abrams","subject":"DW brand-starter HTML, captured into Figma (wordmark + type scale + palette + material strip)","body":""},{"hash":"5dc9bf6","date":"2026-06-01 12:19:43 -0700","author":"Steve Abrams","subject":"record DTD-C canonical owners for 6 near-dup clusters (canonicalOwner + shouldRedirectTo per site)","body":""},{"hash":"9e40fd9","date":"2026-06-01 12:14:01 -0700","author":"Steve Abrams","subject":"add live-status probe (119/119 live); fix wallco.ai domain + drop non-site false positive","body":""},{"hash":"e4626c1","date":"2026-06-01 12:11:50 -0700","author":"Steve Abrams","subject":"canonical DW fleet registry: reconcile 76 local microsites + 44 manifest domains into one source-of-truth (120 domains, 6 near-dup clusters)","body":""}]}