← 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 — Magic-original wallpaper & murals. Every pattern generated, never repeated.</p>
+ <p>wallco.ai — Curated-original wallpaper & 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 & murals — every pattern generated, never repeated.</p>
+ <p class="tagline">Curated-original wallpaper & murals — 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')} · ${(design.category || 'mixed').charAt(0).toUpperCase()+(design.category || 'mixed').slice(1)} · ${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 — 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 — 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 — 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 →