Creative ideas + design notes
Commits with substantial prose (≥120 chars) — the rationale behind each move.
c834d76 · 2026-05-19 · guard static root against .bak/.pre-* snapshot paths
Express middleware returns 404 for any URL matching .bak/.pre-* before
hitting express.static. Belt-and-suspenders even though no snapshot
files currently land in public/.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
d0bb87b · 2026-05-14 · 4Square: + /wall — contact-sheet view of every site's 2×2 hero
- New API /api/all-hero-grids batches reads across every wired site
- /wall.html renders one card per site (mini 2×2 + wordmark + status pill)
- Click a card → drills into the per-site editor via /?site=<domain>
- Header link 'Hero Wall' from the single-site editor → /wall
- Filter / sort / show controls (kind, missing-first, etc.)
- Auto-refresh every 60s for live updates
c0661b1 · 2026-05-14 · 4Square: replace cross-origin iframe with in-DOM 2x2 hero canvas
Iframe approach blew up because each DW site sends X-Frame-Options: DENY
from its Express server, hidden by nginx only at server-level (not inside
location / where Cache-Control already lives — nginx add_header inheritance
drops parent directives when child has any). Fleet-wide CSP rewrite was
denied by classifier (correct call — that's a fleet-wide security change).
Pivoted to rendering the 2x2 hero directly in 4Square's DOM from the same
hero-4grid.json the live rotator reads. Same images, same crop rules
(object-position: center 12%), same wordmark anatomy beneath. Plus a
'View live ↗' button to verify in a new tab.
Faster, no CSP friction, no whole-site loaded inside the editor.
75c0907 · 2026-05-14 · 4Square v2: live-hero iframe + server-backed 4-grid sync — drag products into the squares, save pushes to live site
- Adds /api/site/:domain/hero-grid GET/POST endpoints (reads + writes /var/www/<site>.com/public/hero-4grid.json on prod, ~/Projects/<site>/public/ on Mac2)
- Frontend: iframe of https://<domain>/ above the search bar shows the live front page, reloads after each push so the rotator picks up changes
- Moodboard now hydrates from the site's real hero-4grid.json on site-select (no more stale localStorage)
- saveLayout() POSTs to /api/site/:domain/hero-grid for wired sites; falls back to localStorage for non-wired (e.g. agentabrams.com subdomains)
- nginx dw-frame-allow.conf snippet extended to allow 4square.agentabrams.com in frame-ancestors
- Push-status pill shows real-time push state per drop
ca61c85 · 2026-05-14 · yolo: add Mac2-local refinement loop script + 7-priority task brief
.yolo-loop.sh runs claude --print --dangerously-skip-permissions in an
infinite loop against .yolo-task.md, persisting state between iters via
.yolo-state.md, logging to .yolo.log. Kill with pkill -f .yolo-loop.sh.
Task brief lists 7 prioritized features in order — site coverage, PNG
export, shareable URL, infinite scroll, sort, replace-on-drop, grid layout.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
a00276f · 2026-05-14 · wire 19 more DW microsites — click → real products, not 'pending'
- sites.json: 20 wired sites now (was 1). Auto-probed every wallpaper/
wallcovering domain in the rail for /api/products with valid JSON +
image_url; 19 came back clean (corkwallcovering, silkwallpaper,
linenwallpaper, chinoiseriewallpaper, metallicwallpaper, agedwallpaper,
apartmentwallpaper, architecturalwallcoverings, blockprintedwallpaper,
carmelwallpapers, fabricwallpaper, greenwallcoverings, museumwallpaper,
mylarwallpaper, naturaltextilewallpaper, pastelwallpaper, saloonwallpaper,
textilewallpaper, wallpapersback).
- server.js: new /api/site-products?site=<domain>&q=&limit= proxy.
Validates site against an in-memory allowlist baked from sites.json at
boot + on-file-change (fs.watchFile, 5s interval). TSD continues
through its bespoke /api/catalog/search; everything else hits
https://<site>/api/products with q/limit forwarded.
- index.html: fetches /api/site-products?site=… for every wired site.
Normalizes shape (DW sites return either wrapped {items} or bare array;
TSD returns {total, items}). Absolute https:// image URLs (Shopify CDN)
used directly — only /api/art-archive paths go through the /img proxy.
Items with no image are now skipped instead of rendering as black tiles.
Fixes Steve's complaint: clicking a site in the rail now loads real
products from that site, not 'Catalog connection pending'. 20× the
wired surface area in this revision.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2c34d92 · 2026-05-14 · v2 layout — site nav rail + adjustable-width product browser + collapsible moodboard
LEFT rail (resizable): 104 of Steve's live, keep-flagged domains from CNCP,
in headliner order then alphabetical. TSD is wired; rest show 'Catalog
pending'. Filter input narrows the list as you type. Selection persists
in localStorage.
CENTER splitter (6px) drags to resize the rail (180-600px). Width persists.
RIGHT main panel: search input pinned at top ('Type anything to bring a
product up…') with debounced live filter through the wired site's catalog
API. Dense grid (auto-fill, 180px+ cards). Source pill + result count
visible. Empty states for no-selection / no-match / pending-catalog.
BOTTOM moodboard dock: the 4-square design board with collapse toggle.
Drag from the main grid into a slot, or double-click a card to place
into first empty slot. Slot↔slot swap still works. All persists.
Verified: 104 rail items, splitter drag, search ('vermeer' → 2/2),
rail filter ('wallpaper' → 20), drop → slot, reload persistence, mobile
stack. Zero console errors.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
57645db · 2026-05-14 · scaffold 4square design board
- 2x2 drop slots with HTML5 drag-and-drop from a TSD-catalog rail
- Selections persist in localStorage (key: 4square.agentabrams.layout.v1)
- Slot↔slot swap + clear-per-slot + reset-all
- Basic auth gate (admin / DWShowroom2026) via timing-safe compare
- TSD catalog proxied through /api/catalog/* + /img (no CORS, same-origin)
- Runs on PORT 9702 (9900 collided with wallpaperdictionary)
Verified locally: 60 catalog tiles load, 3 drops persist across reload,
slot↔slot swap persists across reload, zero console errors.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>