[object Object]

← back to Wallco Ai

rename: Magic → Curated across all customer-facing copy on wallco.ai (plus strip residual fav-count chip update)

b4ba6e14ace88707ff46df083d5cbcae3474ac8c · 2026-05-20 10:21:04 -0700 · Steve Abrams

Files touched

Diff

commit b4ba6e14ace88707ff46df083d5cbcae3474ac8c
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed May 20 10:21:04 2026 -0700

    rename: Magic → Curated across all customer-facing copy on wallco.ai (plus strip residual fav-count chip update)
---
 server.js | 122 +++++++++++++++++++++++++++++++-------------------------------
 1 file changed, 61 insertions(+), 61 deletions(-)

diff --git a/server.js b/server.js
index 0b3b54b..a54db42 100644
--- a/server.js
+++ b/server.js
@@ -1,14 +1,14 @@
 #!/usr/bin/env node
 /**
  * wallco.ai — customer-facing storefront
- * Magic-original wallpaper and murals — every pattern generated, never repeated.
+ * Curated-original wallpaper and murals — every pattern generated, never repeated.
  *
  * Routes:
  *   GET /              — hero + featured designs grid (home)
  *   GET /designs       — full catalog grid with sort + density + filter
  *   GET /design/:id    — design detail page
  *   GET /murals        — mural-mode designs
- *   GET /about         — Magic provenance
+ *   GET /about         — Curated provenance
  *   GET /samples       — lead capture (no commerce in v1)
  *   GET /health        — {ok, count}
  *   POST /api/leads    — sample request lead capture → dw_unified.wallco_leads
@@ -931,7 +931,7 @@ app.post('/admin/reload-designs', (req, res) => {
 
 // ── Inspirations gallery (admin-only) ─────────────────────────────────────
 // Side-by-side viewer: real archival seed (vendor visible) ON LEFT, the
-// Magic-generated wallco design (NO vendor leak) ON RIGHT. Powered by the new
+// Curated-generated wallco design (NO vendor leak) ON RIGHT. Powered by the new
 // scripts/inspiration_generator.js pipeline. Vendor identity is ADMIN-ONLY —
 // surfaced here, NEVER on /design/:id.
 app.get('/admin/inspirations', (req, res) => {
@@ -2683,7 +2683,7 @@ function htmlHeader(active) {
 }
 
 const FOOTER = `<footer class="site-footer">
-  <p>wallco.ai &mdash; Magic-original wallpaper &amp; murals. Every pattern generated, never repeated.</p>
+  <p>wallco.ai &mdash; Curated-original wallpaper &amp; murals. Every pattern generated, never repeated.</p>
   <p>Part of the <a href="https://designerwallcoverings.com">Designer Wallcoverings</a> family.</p>
   <p class="footer-contact">
     <a href="mailto:info@wallco.ai">info@wallco.ai</a>
@@ -2900,7 +2900,7 @@ app.get('/', (req, res) => {
         "@type": "WebSite",
         "name": "wallco.ai",
         "url": "https://wallco.ai",
-        "description": "Magic-original wallpaper and murals — every pattern generated, never repeated."
+        "description": "Curated-original wallpaper and murals — every pattern generated, never repeated."
       },
       {
         "@type": "ItemList",
@@ -2966,7 +2966,7 @@ app.get('/', (req, res) => {
 ` : '';
 
   res.type('html').send(`${htmlHead({
-    title: 'wallco.ai — Magic-Original Wallpaper & Murals',
+    title: 'wallco.ai — Curated-Original Wallpaper & Murals',
     description: 'Original wallpaper and murals from wallco.ai. Every pattern hand-curated through our proprietary design system, never repeated. Browse, preview, and order samples.',
     canonical: 'https://wallco.ai/',
     // Preload the hero's first slide + first few featured cards so LCP starts
@@ -2994,7 +2994,7 @@ ${htmlHeader('/')}
 <!-- Wordmark below hero (Gucci-anatomy per standing rule) -->
 <div class="hero-wordmark-below">
   <h1 class="wordmark">wallco.ai</h1>
-  <p class="tagline">Magic-original wallpaper &amp; murals &mdash; every pattern generated, never repeated.</p>
+  <p class="tagline">Curated-original wallpaper &amp; murals &mdash; every pattern generated, never repeated.</p>
 </div>
 
 ${butterflySection}
@@ -3662,7 +3662,7 @@ app.get('/designs', (req, res) => {
           <span class="card-sku" title="DW catalog SKU">${sku}</span>
           <span class="card-colorname">${colorName} <span class="color-dot" style="background:${d.dominant_hex}" aria-hidden="true"></span><span class="card-hex">${(d.dominant_hex || '').toUpperCase()}</span></span>
           <span class="card-tags">
-            <span class="card-ai-badge" title="Magic-designed pattern">✦ Magic-Designed</span>
+            <span class="card-ai-badge" title="Curated-designed pattern">✦ Curated-Designed</span>
             <span class="card-style">${styleTag}</span>
           </span>
         </div>
@@ -3792,7 +3792,7 @@ app.get('/designs', (req, res) => {
   ].filter(Boolean);
   const _titleHead = _titleCrumbs.length
     ? `${_titleCrumbs[0]} · ${total} design${total===1?'':'s'} — wallco.ai`
-    : `All Designs — wallco.ai | Magic-Original Wallpaper & Murals`;
+    : `All Designs — wallco.ai | Curated-Original Wallpaper & Murals`;
   // When the user lands on a filtered grid (?hue=rose, ?motif=floral, ?cat=…),
   // share-link previews on Twitter/LinkedIn/Slack should show a REAL design
   // from that filter, not the generic og-default.png. Picks the first design
@@ -3864,17 +3864,17 @@ ${cat === 'mural-scenic' ? `
 </section>
 ` : ''}
 
-<!-- ── Source filter chips — toggle between Magic Designs and the Designer Library.
+<!-- ── Source filter chips — toggle between Curated Designs and the Designer Library.
      Per spec ?source=ai|library|all — v1 implements ai vs library as a hard
      link split (the two surfaces have different sort+filter shapes so a true
-     unified "all" view is deferred). "all" defaults to Magic for now. TODO(steve):
+     unified "all" view is deferred). "all" defaults to Curated for now. TODO(steve):
      merge LIBRARY.rows into DESIGNS for a true unified source=all listing. -->
 <div class="source-chip-row" style="max-width:1400px;margin:0 auto;padding:20px 24px 0;display:flex;gap:8px;align-items:center;flex-wrap:wrap" data-source="${(req.query.source === 'all') ? 'all' : 'ai'}">
   <span style="font:11px var(--sans,system-ui);letter-spacing:.18em;text-transform:uppercase;color:var(--ink-faint,#8a7a5e);margin-right:6px">Source</span>
-  <a href="/designs" class="src-chip" style="padding:6px 14px;border-radius:999px;border:1px solid ${(req.query.source !== 'all') ? 'var(--accent,#1a1a1a)' : 'var(--line,#d8d0c0)'};background:${(req.query.source !== 'all') ? 'var(--accent,#1a1a1a)' : 'transparent'};color:${(req.query.source !== 'all') ? 'var(--bg,#fff)' : 'var(--ink,#3a2818)'};font:11px var(--sans);letter-spacing:.04em;text-decoration:none">✦ Magic Designs</a>
+  <a href="/designs" class="src-chip" style="padding:6px 14px;border-radius:999px;border:1px solid ${(req.query.source !== 'all') ? 'var(--accent,#1a1a1a)' : 'var(--line,#d8d0c0)'};background:${(req.query.source !== 'all') ? 'var(--accent,#1a1a1a)' : 'transparent'};color:${(req.query.source !== 'all') ? 'var(--bg,#fff)' : 'var(--ink,#3a2818)'};font:11px var(--sans);letter-spacing:.04em;text-decoration:none">✦ Curated Designs</a>
   ${isAdmin(req) ? `<a href="/library" class="src-chip" style="padding:6px 14px;border-radius:999px;border:1px solid var(--line,#d8d0c0);background:transparent;color:var(--ink,#3a2818);font:11px var(--sans);letter-spacing:.04em;text-decoration:none">★ Designer Library</a>
   <a href="/designs?source=all" class="src-chip" style="padding:6px 14px;border-radius:999px;border:1px solid ${(req.query.source === 'all') ? 'var(--accent,#1a1a1a)' : 'var(--line,#d8d0c0)'};background:${(req.query.source === 'all') ? 'var(--accent,#1a1a1a)' : 'transparent'};color:${(req.query.source === 'all') ? 'var(--bg,#fff)' : 'var(--ink,#3a2818)'};font:11px var(--sans);letter-spacing:.04em;text-decoration:none">★ All (Combined)</a>` : ''}
-  <span style="font:11px var(--sans);color:var(--ink-faint,#8a7a5e);margin-left:auto">${isAdmin(req) ? ((req.query.source === 'all') ? 'AI + designer library' : 'Magic-generated patterns') : 'Magic-generated patterns'}</span>
+  <span style="font:11px var(--sans);color:var(--ink-faint,#8a7a5e);margin-left:auto">${isAdmin(req) ? ((req.query.source === 'all') ? 'AI + designer library' : 'Curated-generated patterns') : 'Curated-generated patterns'}</span>
 </div>
 ${(req.query.source === 'all') ? `
 <script>
@@ -4676,7 +4676,7 @@ ${FOOTER}
         this.style.background = on ? 'var(--accent,#c9a14b)' : 'transparent';
         this.style.color = on ? 'var(--bg,#fff)' : 'var(--ink-soft)';
         this.style.borderColor = on ? 'var(--accent,#c9a14b)' : 'var(--line)';
-        this.innerHTML = (on ? '♥' : '♡') + ' Favorites <span id="fav-only-count" style="opacity:.55">·' + favs.size + '</span>';
+        this.innerHTML = (on ? '♥' : '♡') + ' Favorites';
         applyFavFilter(on);
       });
     }
@@ -6355,7 +6355,7 @@ app.get('/design/:id', (req, res) => {
   // JSON-LD Product — enriched 2026-05-12 with sku/productID/color/material +
   // additionalProperty (motifs, room previews, seed). Description weaves the
   // top motifs + dominant hue so Google's snippet has real signal beyond
-  // "Magic-generated wallpaper". Reference: schema.org/Product + Google Rich Result spec.
+  // "Curated-generated wallpaper". Reference: schema.org/Product + Google Rich Result spec.
   const _motifList = (design.motifs || []).slice(0, 4).join(', ');
   const _hueName = (() => {
     const h = (design.dominant_hex || '').toLowerCase();
@@ -6371,7 +6371,7 @@ app.get('/design/:id', (req, res) => {
   const _enrichedDesc =
     `wallco.ai original ${design.category} wallpaper pattern in ${_hueName} (${design.dominant_hex})` +
     (_motifList ? `. Motifs: ${_motifList}.` : '.') +
-    ` Pattern No.${design.id}, generated through our proprietary Magic design system — every pattern unique, never repeated.` +
+    ` Pattern No.${design.id}, generated through our proprietary Curated design system — every pattern unique, never repeated.` +
     ((design.room_mockups || []).length > 0
       ? ` Includes ${design.room_mockups.length} room visualizations (residential, commercial, hospitality).`
       : '') +
@@ -6486,16 +6486,16 @@ ${htmlHeader('/designs')}
                 <dt>Dominant hex</dt><dd><span class="hex-chip" style="background:${design.dominant_hex}"></span>${design.dominant_hex}</dd>
               </dl>
 
-              <!-- Magic Interior Designer block — admin-only (front-end hides for
+              <!-- Curated Interior Designer block — admin-only (front-end hides for
                    non-admins; endpoint is requireAdmin so non-admins 404
                    anyway). Generates title / pattern / color name / DIG# /
                    tags via Gemini Vision per /interior-designer skill. -->
               <div id="ai-designer-block" style="display:none;margin-top:24px;padding:16px;border:1px solid #d4cfc1;border-radius:8px;background:#faf7f1">
                 <div style="display:flex;align-items:center;justify-content:space-between;gap:12px">
-                  <h3 class="pane-h" style="margin:0">Magic Interior Designer</h3>
+                  <h3 class="pane-h" style="margin:0">Curated Interior Designer</h3>
                   <button id="ai-designer-run" type="button"
                     style="padding:8px 14px;border:0;border-radius:4px;background:#1f1808;color:#f4ece0;font:600 11px var(--sans,system-ui);letter-spacing:.08em;text-transform:uppercase;cursor:pointer">
-                    Run Magic Designer
+                    Run Curated Designer
                   </button>
                 </div>
                 <p class="pane-readout" style="margin:6px 0 12px">
@@ -7694,7 +7694,7 @@ ${htmlHeader('/designs')}
       <h1 class="detail-title">${design.title}</h1>
 
       <div class="provenance-badge">
-        ${_isAdmin ? `<span class="ai-badge">Magic-Original</span>` : ''}
+        ${_isAdmin ? `<span class="ai-badge">Curated-Original</span>` : ''}
         Pattern No.${String(design.id).padStart(4,'0')} &middot; ${(design.category || 'mixed').charAt(0).toUpperCase()+(design.category || 'mixed').slice(1)} &middot; ${design.kind === 'seamless_tile' ? 'Seamless Tile' : (design.kind || 'pattern')}
       </div>
 
@@ -7740,10 +7740,10 @@ ${htmlHeader('/designs')}
       })();
       </script>
 
-      <!-- Magic Suggested Rating (graphic designer + interior designer) -->
+      <!-- Curated Suggested Rating (graphic designer + interior designer) -->
       <div id="ai-rating-card" style="display:none;margin:14px 0;padding:14px 16px;background:#1a1816;color:#e8e2d6;border-radius:8px;border:1px solid #2a2a2a;font-size:13px">
         <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:8px">
-          <strong style="font-family:'Cormorant Garamond',serif;font-weight:400;font-size:16px;color:#d2b15c">Magic Suggested Rating</strong>
+          <strong style="font-family:'Cormorant Garamond',serif;font-weight:400;font-size:16px;color:#d2b15c">Curated Suggested Rating</strong>
           <span id="rating-combined" style="font-size:18px;color:#d2b15c"></span>
         </div>
         <div id="rating-summary" style="color:#bba;font-size:12px;line-height:1.55"></div>
@@ -8032,11 +8032,11 @@ ${htmlHeader('/designs')}
           var panelLengthFt = 27; // standard roll length in ft (a typical 27 sq-ft single roll)
           var wallSqFt = w * h;
           var panelCoverageFt2 = (panelWidthInches/12) * panelLengthFt; // each panel covers this many sq-ft
-          // Match-waste factor: Magic-original tiles are 24×24 in seamless so most patterns repeat cleanly. Use a 15% waste buffer.
+          // Match-waste factor: Curated-original tiles are 24×24 in seamless so most patterns repeat cleanly. Use a 15% waste buffer.
           var withWaste = wallSqFt * 1.15;
           var panels = Math.ceil(withWaste / panelCoverageFt2);
           var totalYards = +((panels * panelLengthFt) / 3).toFixed(1);
-          // Rough pricing tier: $7.50/sq-ft installed material list (typical mid-range custom wall, Magic-original)
+          // Rough pricing tier: $7.50/sq-ft installed material list (typical mid-range custom wall, Curated-original)
           var lowEnd = Math.round(panels * panelCoverageFt2 * 6.5);
           var highEnd = Math.round(panels * panelCoverageFt2 * 11.5);
           box.style.display='block';
@@ -8543,7 +8543,7 @@ ${htmlHeader('/designs')}
                alt="${design.title} — ${roomCtx[0].label.toLowerCase()}"
                loading="lazy"
                style="display:block;width:100%;height:auto;border-radius:10px 10px 0 0">
-          <figcaption id="room-toggle-cap" style="font-size:12px;color:var(--ink-faint);padding:8px 12px">${roomCtx[0].label} · ${roomCtx[0].room.replace(/_/g,' ')} — Magic rendering</figcaption>
+          <figcaption id="room-toggle-cap" style="font-size:12px;color:var(--ink-faint);padding:8px 12px">${roomCtx[0].label} · ${roomCtx[0].room.replace(/_/g,' ')} — Curated rendering</figcaption>
         </figure>
         <script>
         (function(){
@@ -8567,7 +8567,7 @@ ${htmlHeader('/designs')}
               var room = p.dataset.room;
               img.src = '/designs/room/design_' + did + '_' + room + '.png';
               img.alt = ${JSON.stringify(design.title)} + ' — ' + (labels[room] || '').toLowerCase();
-              cap.textContent = (labels[room]||'') + ' · ' + room.replace(/_/g,' ') + ' — Magic rendering';
+              cap.textContent = (labels[room]||'') + ' · ' + room.replace(/_/g,' ') + ' — Curated rendering';
             });
           });
         })();
@@ -8772,7 +8772,7 @@ ${htmlHeader('/designs')}
           });
         });
 
-        // ── Magic Interior Designer panel (admin-only) ────────────────────────
+        // ── Curated Interior Designer panel (admin-only) ────────────────────────
         (function(){
           var params = new URLSearchParams(window.location.search);
           var adminToken = params.get('admin') || localStorage.getItem('wallco_admin_token') || '';
@@ -9150,12 +9150,12 @@ ${htmlHeader('/designs')}
       </script>
 
       ${_isAdmin ? `
-      <!-- Provenance / Magic-disclosure note — admin-only.
+      <!-- Provenance / Curated-disclosure note — admin-only.
            A public-facing legal disclaimer on every design tile invites scrutiny
            where the design itself is the strongest argument; admins still need
            to see provenance for QA, but customers see a clean design page. -->
       <div class="provenance-note">
-        <strong>Magic-original provenance:</strong> This pattern was generated by <em>wallco.ai</em>.
+        <strong>Curated-original provenance:</strong> This pattern was generated by <em>wallco.ai</em>.
         It does not reproduce any existing copyrighted artwork. Every seed is unique — this exact pattern exists only here.
       </div>
       ` : ''}
@@ -9168,7 +9168,7 @@ ${htmlHeader('/designs')}
   </div>
 
   <!-- Design Coordinate — pulls coordinating stripes/plaids from the DW catalog
-       that use the design's palette, plus Magic-generated coordinates. -->
+       that use the design's palette, plus Curated-generated coordinates. -->
   <section
     id="pairs-well-with"
     class="dc-section"
@@ -9237,7 +9237,7 @@ ${htmlHeader('/designs')}
 
     <div class="pairs-well__ai" id="pairs-well-ai" hidden>
       <div class="pairs-well__panel-head">
-        <h3 style="font:500 22px/1.2 ui-serif,Georgia,serif;">Magic Generated Coordinates <span class="ai-badge">Preview · 24 options</span></h3>
+        <h3 style="font:500 22px/1.2 ui-serif,Georgia,serif;">Curated Generated Coordinates <span class="ai-badge">Preview · 24 options</span></h3>
       </div>
       <!-- ── TOP CONTROLS — repeat width + room scale + columns ─────────────
            All three persist to localStorage. Repeat-width snaps server-side
@@ -9438,7 +9438,7 @@ ${htmlHeader('/designs')}
     .pw-ctrl-val { font-variant-numeric: tabular-nums; color: #1a1a1a;
       font-size: 12px; font-weight: 600; min-width: 64px; text-align: right; }
 
-    /* ── Magic card actions (Duplicate / Edit) — always visible, touch-friendly ─ */
+    /* ── Curated card actions (Duplicate / Edit) — always visible, touch-friendly ─ */
     .pairs-well__card { position: relative; }
     .pw-card-actions {
       position: absolute; top: 6px; right: 6px; z-index: 3;
@@ -9591,7 +9591,7 @@ ${htmlHeader('/designs')}
 
     function renderSourcePalette(pal){if(!pal||!pal.length){sourcePalette.hidden=true;vendorPicker.hidden=true;return}var vs=selectedVendors();var head='<th></th>'+vs.map(function(v){return '<th>'+esc(VENDOR_LABEL[v])+'</th>'}).join('');var body=pal.map(function(c){var hex=typeof c==='string'?c:c.hex;var cells='<td class="swatch"><span class="pw-dot" style="background:'+esc(hex)+'"></span></td>';vs.forEach(function(v){var p=c&&c.paints&&c.paints[v];cells+='<td>'+(p?'<span class="pw-square" style="background:'+esc(p.hex)+'"></span>'+esc(p.name)+' <span class="pw-code">'+esc(p.code)+'</span>':'—')+'</td>'});return '<tr>'+cells+'</tr>'}).join('');sourcePalette.innerHTML='<h4>Color story</h4><table><thead><tr>'+head+'</tr></thead><tbody>'+body+'</tbody></table>';sourcePalette.hidden=false;vendorPicker.hidden=false}
 
-    // ── Card renderer — Magic cards get a pitch chip + Duplicate/Edit buttons.
+    // ── Card renderer — Curated cards get a pitch chip + Duplicate/Edit buttons.
     function renderCard(p, isAi, idx) {
       var img = p.image_url ? esc(p.image_url) : '';
       var why = (p.why && p.why[0]) ? esc(p.why[0]) : (p.motif ? 'AI ' + esc(p.motif) : '');
@@ -9625,7 +9625,7 @@ ${htmlHeader('/designs')}
           + '<button type="button" class="pw-dup" data-card-action="duplicate" data-idx="'+idx+'">⎘ Duplicate</button>'
           + '</div>'
         : '';
-      // For Magic cards the href doesn't lead anywhere (placeholder) — use a div instead of an <a>
+      // For Curated cards the href doesn't lead anywhere (placeholder) — use a div instead of an <a>
       // so the Duplicate/Edit buttons don't trigger navigation when clicked.
       var Tag = isAi ? 'div' : 'a';
       var openAttrs = isAi ? '' : ' target="_blank" rel="noopener" href="'+href+'"';
@@ -9725,7 +9725,7 @@ ${htmlHeader('/designs')}
       fetch(buildUrl(endpointAi, 24, { tile_in: parseFloat(tileIn.value) }), { credentials: 'omit' })
         .then(function (r) { return r.ok ? r.json() : Promise.reject(new Error('http ' + r.status)); })
         .then(function (d) { if (!d || d.ok === false) throw new Error('bad payload'); cachedAi = d.items || []; renderAiGrid(); })
-        .catch(function () { aiGrid.innerHTML = '<div class="pairs-well__empty">Magic generator not ready.</div>'; });
+        .catch(function () { aiGrid.innerHTML = '<div class="pairs-well__empty">Curated generator not ready.</div>'; });
     }
 
     function load() {
@@ -9747,7 +9747,7 @@ ${htmlHeader('/designs')}
       var ap = fetch(buildUrl(endpointAi, 24, { tile_in: parseFloat(tileIn.value) }), { credentials: 'omit' })
         .then(function (r) { return r.ok ? r.json() : Promise.reject(new Error('http ' + r.status)); })
         .then(function (d) { if (!d || d.ok === false) throw new Error('bad payload'); cachedAi = d.items || []; renderAiGrid(); })
-        .catch(function () { aiGrid.innerHTML = '<div class="pairs-well__empty">Magic generator not ready.</div>'; });
+        .catch(function () { aiGrid.innerHTML = '<div class="pairs-well__empty">Curated generator not ready.</div>'; });
       return Promise.all([pp, ap]);
     }
 
@@ -9763,7 +9763,7 @@ ${htmlHeader('/designs')}
       load();
     });
 
-    // ── Duplicate / Edit button handler on Magic cards ─────────────────────────
+    // ── Duplicate / Edit button handler on Curated cards ─────────────────────────
     function duplicateName(name) {
       // "X" → "X (copy)" → "X (copy 2)" → "X (copy 3)"...
       var m = /^(.*?) \(copy(?: (\d+))?\)$/.exec(name);
@@ -10246,7 +10246,7 @@ app.get('/design/:id/tearsheet', (req, res) => {
   ${motifs ? `<dt>Motifs</dt><dd>${esc(motifs)}</dd>` : ''}
   <dt>Tile Size</dt><dd>24×24 in seamless · 150 DPI</dd>
   <dt>Repeat</dt><dd>24" horizontal · 24" vertical (full drop)</dd>
-  <dt>Format</dt><dd>Magic-original · seamless tile · scalable to any wall</dd>
+  <dt>Format</dt><dd>Curated-original · seamless tile · scalable to any wall</dd>
   <dt>Substrate</dt><dd>Type II vinyl · nonwoven paper · peel-and-stick · canvas mural</dd>
   <dt>Fire Rating</dt><dd>Class A available (Type II vinyl substrate, ASTM E84)</dd>
   <dt>Cleanability</dt><dd>Scrubbable (vinyl) · Spongeable (paper)</dd>
@@ -10262,7 +10262,7 @@ app.get('/design/:id/tearsheet', (req, res) => {
     <strong>Designer Wallcoverings</strong><br>
     15442 Ventura Bl #102, Sherman Oaks CA 91403<br>
     <strong>info@designerwallcoverings.com</strong> · designerwallcoverings.com<br>
-    Magic-original wallpaper, hand-curated. Free trade samples.
+    Curated-original wallpaper, hand-curated. Free trade samples.
   </div>
   <div style="text-align:right">
     Generated ${new Date().toISOString().slice(0,10)}<br>
@@ -10782,7 +10782,7 @@ app.get('/brief', (req, res) => {
   <div class="footer">
     <strong>Designer Wallcoverings</strong> · 15442 Ventura Bl #102, Sherman Oaks CA 91403<br>
     <strong>info@designerwallcoverings.com</strong> · designerwallcoverings.com<br>
-    Magic-original wallpaper, hand-curated. Free trade samples on request.
+    Curated-original wallpaper, hand-curated. Free trade samples on request.
   </div>
 </section>
 ${designs.map(tearsheet).join('')}
@@ -10837,7 +10837,7 @@ app.get('/murals', (req, res) => {
 
   res.type('html').send(`${htmlHead({
     title: 'Murals — wallco.ai | Original Wall Murals',
-    description: 'Magic-original wall murals in any size, panelized for installation. Every design unique.',
+    description: 'Curated-original wall murals in any size, panelized for installation. Every design unique.',
     canonical: 'https://wallco.ai/murals'
   })}
 <body>
@@ -10926,8 +10926,8 @@ app.get('/provenance', (req, res) => res.redirect(301, '/about'));
 // ── ABOUT
 app.get('/about', (req, res) => {
   res.type('html').send(`${htmlHead({
-    title: 'About — wallco.ai | How Magic Wallpaper is Made',
-    description: 'Learn how wallco.ai generates original wallpaper patterns using Magic. Every design is unique, Magic-original, never licensed from a vendor.',
+    title: 'About — wallco.ai | How Curated Wallpaper is Made',
+    description: 'Learn how wallco.ai generates original wallpaper patterns using Curated. Every design is unique, Curated-original, never licensed from a vendor.',
     canonical: 'https://wallco.ai/about'
   })}
 <body>
@@ -10936,16 +10936,16 @@ ${htmlHeader('/about')}
   <article class="prose">
     <h1>How wallco.ai works</h1>
 
-    <h2>Magic-original, never licensed</h2>
-    <p>Every pattern on wallco.ai was generated by an Magic model — not sourced from a vendor catalog,
+    <h2>Curated-original, never licensed</h2>
+    <p>Every pattern on wallco.ai was generated by an Curated model — not sourced from a vendor catalog,
     not licensed from a studio. Each design is produced from a text prompt and a unique random seed,
     so the pattern that emerges is mathematically unrepeatable.</p>
 
     <h2>The generation pipeline</h2>
-    <p>Each pattern is rendered by our proprietary Magic-design system, drawing inspiration from
+    <p>Each pattern is rendered by our proprietary Curated-design system, drawing inspiration from
     public-domain artwork in the Metropolitan Museum of Art, Wikimedia Commons, and the
     Smithsonian Institution — institutions with open licenses (CC0 / Public Domain) that
-    permit derivative Magic generation.</p>
+    permit derivative Curated generation.</p>
 
     <h2>Seamless tiling</h2>
     <p>Each design is generated as a seamless tile — the edges match on all four sides, so it can
@@ -10957,7 +10957,7 @@ ${htmlHeader('/about')}
 
     <h2>About wallco.ai</h2>
     <p>wallco.ai is a product of <a href="https://designerwallcoverings.com">Designer Wallcoverings</a>,
-    Sherman Oaks, CA. We combine 30 years of wallcovering expertise with frontier Magic generation to
+    Sherman Oaks, CA. We combine 30 years of wallcovering expertise with frontier Curated generation to
     create patterns that have never existed before.</p>
 
     <p><a href="/samples" class="btn-primary">Request a Free Sample</a></p>
@@ -10970,7 +10970,7 @@ ${FOOTER}
   "@type":"WebPage",
   "name":"About wallco.ai",
   "url":"https://wallco.ai/about",
-  "description":"How wallco.ai generates original Magic wallpaper patterns.",
+  "description":"How wallco.ai generates original Curated wallpaper patterns.",
   "isPartOf":{"@type":"WebSite","url":"https://wallco.ai","name":"wallco.ai"}
 })}</script>
 ${HAMBURGER_JS}
@@ -10979,7 +10979,7 @@ ${HAMBURGER_JS}
 });
 
 // ── /age-themes — curated "best theme per age" comparison page
-// Honest framing: Magic-generated starting point (ui-ux-designer subagent + debate-team-fast
+// Honest framing: Curated-generated starting point (ui-ux-designer subagent + debate-team-fast
 // adversarial review). Companion Figma file at figma.com/design/WmwSirHywv530eACPtbqyA.
 // APCA-W3 Lc calculator — extracted to shared module (2026-05-12 architect refactor).
 // Canonical at ~/Projects/wallco-ai/src/apca.js · mirrored at
@@ -11164,7 +11164,7 @@ app.get('/age-themes', (req, res) => {
   </nav>
   <div class="credits">
     <strong style="color:#d2b15c">v${AGE_THEME_DATA.version}</strong> · validated ${AGE_THEME_DATA.validated_at} ·
-    <strong style="color:#d2554a">⚠ Magic-generated starting point — not user-tested, not accessibility-tooled.</strong>
+    <strong style="color:#d2554a">⚠ Curated-generated starting point — not user-tested, not accessibility-tooled.</strong>
     Recommendations from the <span class="src">ui-ux-designer</span> subagent (font/hex/size swaps with research citations) and reviewed by the <span class="src">debate-team-fast</span> 3-LLM panel (Claude, Kimi K2.5, Qwen3:14b — Codex quota-blocked). Companion <span class="src">Figma file</span> at <a href="https://www.figma.com/design/WmwSirHywv530eACPtbqyA" target="_blank" style="color:#d2b15c" rel="noopener noreferrer nofollow">figma.com/design/WmwSirHywv530eACPtbqyA</a>. Canonical band data: <code style="color:#d2b15c">~/Projects/wallco-ai/src/bands.json</code> (skill mirror: <code style="color:#666">~/.claude/skills/age-adaptive-theme/bands.json</code>) · APCA module: <code style="color:#d2b15c">~/Projects/wallco-ai/src/apca.js</code>.
     <br><span style="color:#888">Debate-team consensus: Atkinson Hyperlegible / tween indigo / Nunito picks are defensible. The fg #222→#1a1a1a (toddler) and -apple-system→Inter (adult) swaps were LLM "hallucinated precision" — dropped. APCA Lc values shown are calculated by src/apca.js (Myndex 0.1.9), NOT lab-verified. v9 fixes from validation-loop: teen body 16px, line-height 1.5 baseline, btn-min-height 44/48/56px per band.</span>
   </div>
@@ -11804,7 +11804,7 @@ app.post('/api/spoonflower/upload', requireAdmin, (req, res) => {
   if (!file || !fs.existsSync(file)) {
     return res.status(404).json({ ok: false, error: 'design file missing on disk', file });
   }
-  const title = `${d.title} — wallco.ai Magic-Original`;
+  const title = `${d.title} — wallco.ai Curated-Original`;
   const tagList = tags || `wallpaper,wallco-original,${d.category||''},wallco,${d.dominant_hex||''}`.replace(/,+$/,'');
 
   let jobId;
@@ -11932,7 +11932,7 @@ app.post('/api/design/:id/upload-shopify', requireAdmin, express.json({ limit: '
       product_type: 'Wallpaper',
       status: 'draft',
       tags: tagList,
-      body_html: `<p>An Magic-original wallcovering pattern from wallco.ai. DW Original Number ${dig}.</p>`,
+      body_html: `<p>An Curated-original wallcovering pattern from wallco.ai. DW Original Number ${dig}.</p>`,
       variants: [{
         sku: dig,
         price: '0.00',
@@ -12251,7 +12251,7 @@ app.get('/api/voice/preview', async (req, res) => {
   if (!ELEVEN_KEY) return res.status(500).type('text/plain').send('ELEVENLABS_API_KEY not configured');
   const d = findDesign(req.query.design_id);
   if (!d) return res.status(404).type('text/plain').send('design not found');
-  const text = `${d.title}. An Magic-original wallpaper pattern by wallco. Category: ${d.category}. Dominant color: ${d.dominant_hex}. Generated by ${d.generator}, seed ${d.seed}. Every pattern is unique, never repeated.`;
+  const text = `${d.title}. An Curated-original wallpaper pattern by wallco. Category: ${d.category}. Dominant color: ${d.dominant_hex}. Generated by ${d.generator}, seed ${d.seed}. Every pattern is unique, never repeated.`;
   try {
     const r = await fetch(`https://api.elevenlabs.io/v1/text-to-speech/${ELEVEN_VOICE_ID}`, {
       method: 'POST',
@@ -13014,7 +13014,7 @@ Critique as a designer who places this in HIGH-END interiors (Hermès, Soho Hous
   } catch (e) { res.status(500).json({ error: e.message }); }
 });
 
-// ── Magic Interior Designer: assign metadata (title, pattern, color name, DIG#, tags)
+// ── Curated Interior Designer: assign metadata (title, pattern, color name, DIG#, tags)
 // Admin-only. Reads the design image, runs the interior-designer skill's
 // vision pass via Gemini, and persists ai_title / ai_pattern / ai_color_name /
 // dig_number / merged tags. The DIG number, when freshly assigned, slots into
@@ -13882,7 +13882,7 @@ document.getElementById('upload-input').addEventListener('change', async functio
       color_hex_seeds: (j.ai_colors||[]).concat(j.dominant_hex ? [j.dominant_hex] : []),
       selected_elements: j.ai_elements || []
     });
-    stat.innerHTML = '<div style="padding:10px;background:#d4edda;color:#155724;border-radius:4px">✓ Uploaded. Magic detected style: <b>'+(j.ai_style||'unknown')+'</b>, colors: '+(j.ai_colors||[]).join(' ')+', elements: '+(j.ai_elements||[]).join(', ')+'</div>';
+    stat.innerHTML = '<div style="padding:10px;background:#d4edda;color:#155724;border-radius:4px">✓ Uploaded. Curated detected style: <b>'+(j.ai_style||'unknown')+'</b>, colors: '+(j.ai_colors||[]).join(' ')+', elements: '+(j.ai_elements||[]).join(', ')+'</div>';
   } else {
     stat.innerHTML = '<div style="padding:10px;background:#f8d7da;color:#721c24;border-radius:4px">Upload failed: '+(j.error||'unknown')+'</div>';
   }
@@ -14941,7 +14941,7 @@ app.get('/api/poll/stats', (_req, res) => {
 app.get('/poll', (_req, res) => {
   res.type('html').send(`${htmlHead({
     title: 'Pick your favorite — wallco.ai',
-    description: 'Vote between two Magic-original wallpaper designs. Your taste teaches the system.',
+    description: 'Vote between two Curated-original wallpaper designs. Your taste teaches the system.',
     canonical: 'https://wallco.ai/poll'
   })}
 <body>
@@ -14960,7 +14960,7 @@ ${htmlHeader('')}
   </div>
   <div style="text-align:center"><button id="btn-skip" class="btn-outline">Skip &mdash; show me another pair</button></div>
   <hr style="margin:32px 0;border:0;border-top:1px solid rgba(0,0,0,.1)">
-  <h2 style="font-family:'Cormorant Garamond',serif;font-weight:400;font-size:22px;margin:0 0 14px;text-align:center">Top 20 &mdash; combined Magic + user score + Elo</h2>
+  <h2 style="font-family:'Cormorant Garamond',serif;font-weight:400;font-size:22px;margin:0 0 14px;text-align:center">Top 20 &mdash; combined Curated + user score + Elo</h2>
   <div id="leaderboard" style="display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:12px"></div>
 </main>
 ${FOOTER}
@@ -15026,7 +15026,7 @@ ${HAMBURGER_JS}
 app.get('/play', (_req, res) => {
   res.type('html').send(`${htmlHead({
     title: 'Play — wallco.ai',
-    description: 'Three ways to teach our Magic your taste. Swipe, vote, or pick favorites.',
+    description: 'Three ways to teach our Curated your taste. Swipe, vote, or pick favorites.',
     canonical: 'https://wallco.ai/play'
   })}
 <body>
@@ -15148,7 +15148,7 @@ app.get('/api/hot-or-not/recent', (req, res) => {
 // dynamic-from-history layer merges these with whatever's most-clicked.
 const HON_DEFAULT_REASONS = [
   'Colors clash',
-  'Pattern feels Magic-generated / artifacts',
+  'Pattern feels Curated-generated / artifacts',
   'Too busy',
   'Too plain',
   'Wrong scale for a wall',
@@ -15194,7 +15194,7 @@ app.get('/hot-or-not', (_req, res) => {
 ${htmlHeader('')}
 <main style="padding:24px 28px;max-width:760px;margin:0 auto;text-align:center">
   <h1 style="font-family:'Cormorant Garamond',serif;font-weight:300;font-size:34px;margin:0 0 6px">Hot or Not</h1>
-  <p style="color:#666;margin:0 0 22px;font-size:13px">Speed-vote on Magic-original wallpaper. Arrow ← NOT · Arrow → HOT · Space SKIP.</p>
+  <p style="color:#666;margin:0 0 22px;font-size:13px">Speed-vote on Curated-original wallpaper. Arrow ← NOT · Arrow → HOT · Space SKIP.</p>
   <div id="streak" style="margin-bottom:8px;font-size:12px;color:#d2b15c;font-weight:500"></div>
   <div id="wc-game-banner" style="background:#1a1816;border-radius:10px;padding:14px 18px;margin-bottom:18px;border:1px solid rgba(210,177,92,.2)"></div>
   <div id="hon-card" style="position:relative;border:1px solid rgba(0,0,0,.1);border-radius:14px;overflow:hidden;background:#1a1816;box-shadow:0 20px 60px rgba(0,0,0,.18);transition:transform .26s ease, opacity .26s ease">

← 2fed040 ui: strip faded ·N count suffix from category/motif/room/fav  ·  back to Wallco Ai  ·  ui: surface ALL styles + populated color dots on /designs gr 9cf8d04 →