← back to Wallco Ai
etsy pipeline: brand → Fentucci Designs (was Designer Wallcoverings) in single-listing footer + bundle footer + intro line
f32ecb63a23cf59488aab6b70404b3e849874c07 · 2026-05-28 07:38:45 -0700 · Steve Abrams
Files touched
M public/admin/cactus-curator.htmlM scripts/export-etsy-digital.jsM scripts/generate-etsy-bundles.js
Diff
commit f32ecb63a23cf59488aab6b70404b3e849874c07
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Thu May 28 07:38:45 2026 -0700
etsy pipeline: brand → Fentucci Designs (was Designer Wallcoverings) in single-listing footer + bundle footer + intro line
---
public/admin/cactus-curator.html | 44 ++++++++++++++++++++++++++++++++++++++--
scripts/export-etsy-digital.js | 4 ++--
scripts/generate-etsy-bundles.js | 4 +++-
3 files changed, 47 insertions(+), 5 deletions(-)
diff --git a/public/admin/cactus-curator.html b/public/admin/cactus-curator.html
index 0c0add9..6751681 100644
--- a/public/admin/cactus-curator.html
+++ b/public/admin/cactus-curator.html
@@ -1004,6 +1004,7 @@ load();
<span id="hmtitle" style="flex:1;text-align:center;color:#aaa">—</span>
<span id="hmsel" style="color:#ffd0d0">0 regions</span>
<button id="hmheal" style="background:#3b2e08;color:#f0b400;border:1px solid #5a4710;padding:7px 16px;font-weight:800;border-radius:8px;cursor:pointer">⚕ Heal selected</button>
+ <button id="hmregen" style="background:#1d2c3b;color:#7ec8ff;border:1px solid #365778;padding:7px 16px;font-weight:800;border-radius:8px;cursor:pointer" title="re-run the original prompt with a new seed — guaranteed clean lines (heal can degrade quality on flat designs)">⟲ Regenerate</button>
<button id="hmaccept" style="background:#2a6b35;color:#fff;border:0;padding:7px 16px;font-weight:800;border-radius:8px;cursor:pointer" disabled>✓ Accept</button>
<button id="hmclose" style="background:#3a2222;color:#ffdada;border:1px solid #663;padding:7px 14px;font-weight:700;border-radius:8px;cursor:pointer">✕ Close</button>
</header>
@@ -1018,6 +1019,7 @@ load();
modal.querySelector('#hmclose').onclick = closeModal;
modal.querySelector('#hmback').onclick = back;
modal.querySelector('#hmheal').onclick = heal;
+ modal.querySelector('#hmregen').onclick = regenerate;
modal.querySelector('#hmaccept').onclick = accept;
wireDraw();
return modal;
@@ -1084,12 +1086,17 @@ load();
if (modal) modal.style.display = 'none';
original = current = null; history = []; manual = [];
}
+ // Heal returns ok even when the result is QUALITY-DEGRADED (SDXL inpaint on a
+ // flat-screen-print tile often produces a worse seam than the original). Steve
+ // rule: "100% clean lines always — it cannot look fixed." So we compare
+ // scan_after vs scan_before, and if the heal degraded the tile, we auto-fall
+ // back to ⟲ Regenerate (which re-rolls from the original prompt instead).
async function heal() {
if (!manual.length) { flash('drag on image to mark a region first'); return; }
const btn = modal.querySelector('#hmheal'); const orig = btn.textContent;
btn.disabled = true; btn.textContent = `⚕ healing ${manual.length}…`;
const status = modal.querySelector('#hmfoot');
- status.textContent = `inpainting ${manual.length} region(s) on #${current} via Replicate (~3-8s)…`;
+ status.textContent = `inpainting ${manual.length} region(s) on #${current} via Replicate (~10-15s)…`;
try {
const r = await fetch(q(`/api/seam-debug/${current}/heal`), {
method:'POST', headers:{'Content-Type':'application/json'},
@@ -1097,15 +1104,48 @@ load();
});
const j = await r.json();
if (!r.ok || !j.ok) throw new Error(j.error || ('HTTP ' + r.status));
+ const before = j.scan_before?.scores?.overall_max, after = j.scan_after?.scores?.overall_max;
+ const degraded = Number.isFinite(before) && Number.isFinite(after) && after > before + 0.3;
+ if (degraded) {
+ // Don't push degraded heal onto the history — discard it. Auto-fall back
+ // to regenerate so the curator never has to manually undo + click again.
+ status.innerHTML = `⚠ heal degraded the tile (overall_max ${before.toFixed(2)} → ${after.toFixed(2)}) — discarding and ⟲ regenerating from the original prompt instead…`;
+ await regenerate({ silent: true });
+ return;
+ }
history.push({ id: current, boxes: manual.slice() });
showId(j.new_id);
- status.textContent = `✓ heal #${j.new_id} ready — ⚕ heal again to refine, ↺ Back to revert, or ✓ Accept to replace original #${original}`;
+ status.textContent = `✓ heal #${j.new_id} (overall_max ${before?.toFixed(2)} → ${after?.toFixed(2)}) — ⚕ heal again, ↺ Back, or ✓ Accept`;
} catch (e) {
status.textContent = '✗ heal failed: ' + e.message;
} finally {
btn.disabled = false; btn.textContent = orig;
}
}
+ // ⟲ Regenerate — re-runs generate_designs.js with the original prompt + new
+ // seed. Always produces clean lines (no inpaint stitching). Used as a manual
+ // option AND as the auto-fallback when heal degrades quality.
+ async function regenerate({ silent = false } = {}) {
+ const btn = modal.querySelector('#hmregen'); const orig = btn.textContent;
+ btn.disabled = true; btn.textContent = '⟲ regenerating…';
+ const status = modal.querySelector('#hmfoot');
+ if (!silent) status.textContent = `re-rolling #${current} from the original prompt with a new seed (~30-60s)…`;
+ try {
+ const r = await fetch(q(`/api/seam-debug/${current}/regenerate`), {
+ method: 'POST', headers: { 'Content-Type': 'application/json' }, body: '{}',
+ });
+ const j = await r.json();
+ if (!r.ok || !j.ok) throw new Error(j.error || ('HTTP ' + r.status));
+ history.push({ id: current, boxes: manual.slice() });
+ manual = [];
+ showId(j.new_id);
+ status.textContent = `✓ regenerated #${j.new_id} — ⟲ again for another roll, ↺ Back to revert, ✓ Accept to replace original #${original}`;
+ } catch (e) {
+ status.textContent = '✗ regenerate failed: ' + e.message;
+ } finally {
+ btn.disabled = false; btn.textContent = orig;
+ }
+ }
function back() {
const prev = history.pop(); if (!prev) return;
showId(prev.id);
diff --git a/scripts/export-etsy-digital.js b/scripts/export-etsy-digital.js
index ffe46ee..51f3183 100644
--- a/scripts/export-etsy-digital.js
+++ b/scripts/export-etsy-digital.js
@@ -117,7 +117,7 @@ function deriveDescription(d, title, pxOut) {
'',
'INSTANT DOWNLOAD · This listing is for a digital file only. No physical product ships.',
'',
- `🎨 A seamless wallpaper tile from the Designer Wallcoverings AI-original archive. Every pattern is unique — never repeated, never resold.`,
+ `🎨 A seamless wallpaper tile from the Fentucci Designs archive. Every pattern is unique — never repeated, never resold.`,
'',
`📐 What you get:`,
`• ${dpiNote}`,
@@ -140,7 +140,7 @@ function deriveDescription(d, title, pxOut) {
'',
`⚠️ Personal use only. Do not redistribute, resell, or claim the design as your own.`,
'',
- `Designed by Designer Wallcoverings · designerwallcoverings.com`,
+ `— Fentucci Designs`,
].join('\n');
}
function deriveTags(d, title) {
diff --git a/scripts/generate-etsy-bundles.js b/scripts/generate-etsy-bundles.js
index d20545f..4476a4c 100644
--- a/scripts/generate-etsy-bundles.js
+++ b/scripts/generate-etsy-bundles.js
@@ -254,7 +254,9 @@ function bundleCopy(name, n, designs) {
'',
`📂 Delivered as a single ZIP via Etsy's automatic download after purchase.`,
'',
- `Curated from the Designer Wallcoverings AI-original archive — every pattern unique, never repeated. Browse more at designerwallcoverings.com.`,
+ `Curated from the Fentucci Designs archive — every pattern unique, never repeated.`,
+ ``,
+ `— Fentucci Designs`,
].join('\n');
return { title, description, tags, price };
}
← b962080 heal: drop SDXL-inpaint strength 0.95 -> 0.7 (blend with sur
·
back to Wallco Ai
·
etsy pipeline brand: Fentucci Digital Packs (final). 4 refer 243bd61 →