← back to Wallco Ai
wallco: generate-lips.js — 10 designer lipstick-brand colorways
1e6fc9a9b069b840ef4ef0f17894f4a2c2a62f2d · 2026-05-20 02:29:40 -0700 · Steve Abrams
Steve directive 2026-05-20: 'we need actual lip wallpaper' (after bleed sweep dropped /designs visible count below threshold).
Colorways: Chanel Rouge, Dior Noir, NARS Jungle Red, MAC Russian Red, YSL Rouge Pur, Tom Ford Cherry, Hermès Orange, Givenchy Rose, Estée Lauder Plum, Guerlain Kiss. Single-ink flat lip silhouettes, generous spacing, anti-ghost prompts baked in to clear bleed_guard.
Files touched
A scripts/generate-lips.js
Diff
commit 1e6fc9a9b069b840ef4ef0f17894f4a2c2a62f2d
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Wed May 20 02:29:40 2026 -0700
wallco: generate-lips.js — 10 designer lipstick-brand colorways
Steve directive 2026-05-20: 'we need actual lip wallpaper' (after bleed sweep dropped /designs visible count below threshold).
Colorways: Chanel Rouge, Dior Noir, NARS Jungle Red, MAC Russian Red, YSL Rouge Pur, Tom Ford Cherry, Hermès Orange, Givenchy Rose, Estée Lauder Plum, Guerlain Kiss. Single-ink flat lip silhouettes, generous spacing, anti-ghost prompts baked in to clear bleed_guard.
---
scripts/generate-lips.js | 94 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 94 insertions(+)
diff --git a/scripts/generate-lips.js b/scripts/generate-lips.js
new file mode 100755
index 0000000..317088a
--- /dev/null
+++ b/scripts/generate-lips.js
@@ -0,0 +1,94 @@
+#!/usr/bin/env node
+// Generate 10 lips wallcovering designs — designer-grade, single-ink lip silhouettes
+// inspired by editorial-fashion / lipstick-brand colorways.
+//
+// Steve directive 2026-05-20: "we need actual lip wallpaper" (after bleed
+// sweep dropped /designs to 128). "Actual" = recognizable lips, not bleed
+// abstractions; designer colorways grounded in real lipstick brand palettes
+// (Chanel rouge, Dior crimson, NARS jungle red, MAC Russian red, etc.).
+//
+// Settlement-safe by construction:
+// - Single ink color figure layer on a single tone ground
+// - Uniform horizontal lip orientation, no rotation
+// - Edge-to-edge tessellation, no Part B motifs (no bananas/grapes/birds/butterflies)
+// - Explicit anti-ghost-layer prompt language so bleed_guard passes them.
+
+const { spawnSync } = require('child_process');
+const path = require('path');
+
+const ROOT = path.join(__dirname, '..');
+
+const COLORWAYS = [
+ { slug: 'chanel-rouge', name: 'Chanel Rouge', ground_hex: '#FFFEF8', ground_name: 'ivory-couture cream', figure_hex: '#A6182E', figure_name: 'classic Chanel rouge' },
+ { slug: 'dior-noir', name: 'Dior Noir', ground_hex: '#0E0E10', ground_name: 'midnight Dior noir', figure_hex: '#C9A14B', figure_name: 'antique-gold leaf' },
+ { slug: 'nars-jungle-red', name: 'NARS Jungle Red', ground_hex: '#1F1B17', ground_name: 'fume noir', figure_hex: '#9C1F1F', figure_name: 'NARS jungle red' },
+ { slug: 'mac-russian-red', name: 'MAC Russian Red', ground_hex: '#F5F0E8', ground_name: 'Russian cream', figure_hex: '#7C0A1E', figure_name: 'MAC Russian red' },
+ { slug: 'ysl-rouge-pur', name: 'YSL Rouge Pur', ground_hex: '#101010', ground_name: 'YSL black couture', figure_hex: '#D6253D', figure_name: 'YSL Rouge Pur Couture' },
+ { slug: 'tom-ford-cherry', name: 'Tom Ford Cherry', ground_hex: '#2A1414', ground_name: 'oxblood velvet', figure_hex: '#E5C76A', figure_name: 'Tom Ford champagne-gold' },
+ { slug: 'hermes-orange', name: 'Hermès Orange', ground_hex: '#F7E9C9', ground_name: 'saddle-stitch cream', figure_hex: '#F37121', figure_name: 'Hermès orange' },
+ { slug: 'givenchy-rose', name: 'Givenchy Rose', ground_hex: '#F2E8E3', ground_name: 'Givenchy bisque rose', figure_hex: '#B14254', figure_name: 'Givenchy rose-mauve' },
+ { slug: 'estee-lauder-plum', name: 'Estée Lauder Plum', ground_hex: '#F7F3EC', ground_name: 'champagne pearl ground', figure_hex: '#5A1F3E', figure_name: 'Estée Lauder plum noir' },
+ { slug: 'guerlain-kiss', name: 'Guerlain Kiss', ground_hex: '#FDF6EE', ground_name: 'Guerlain ivory-blush', figure_hex: '#E47A8F', figure_name: 'Guerlain blush-pink' },
+];
+
+const COMPOSITION =
+ 'Hand-painted gouache silhouettes of soft full lips — closed, parted slightly to show a hint of teeth, ' +
+ 'reading as an editorial fashion-magazine kiss mark. All lips are oriented horizontally (no rotation, ' +
+ 'no tossing, no diagonals). Every lip silhouette is rendered in the EXACT same single ink color with ' +
+ 'NO interior shading, NO highlight gradient, NO outline detail — flat couture stencil only. ' +
+ 'Tessellated seamless wallpaper repeat with even, generous spacing between lips so each motif reads ' +
+ 'cleanly against the ground (NOT crowded edge-to-edge). Designer-grade, archival illustration quality, ' +
+ 'reads as a Tom Ford / YSL flagship-boutique wallcovering. NO ghost layer behind the lips. ' +
+ 'NO faded duplicate of the lip motif. NO halftone, NO ben-day dots, NO atmospheric haze behind the motif. ' +
+ 'The ground is a single flat solid color, the lip silhouettes are a single flat solid color — TWO COLORS TOTAL.';
+
+const ANTI_PROMPT =
+ 'No ghost layer, no ghosted duplicate, no faded copy behind the lips, no atmospheric haze, no airbrush, ' +
+ 'no soft edges, no halftone, no ben-day dots, no dot screen, no crosshatching, no interior shading inside ' +
+ 'the lip silhouette, no highlight gradient, no shine, no lipstick texture, no teeth detail, no tongue, ' +
+ 'no faces, no eyes, no nose, no people. ' +
+ 'No banana, no monstera, no palm, no foliage, no flowers, no birds, no butterflies, no grapes. ' +
+ 'No multi-color rainbow lips, no fluorescent neon colors, no day-glo, no chromatic gradient, no more than ' +
+ 'two colors. No watermark, no signature, no text, no logos. Square aspect ratio, seamless tile repeat, ' +
+ 'no edge artifacts, flat-paper rendering (no room mockup, no perspective, no 3D, no shadow on the wall).';
+
+console.log('Generating ' + COLORWAYS.length + ' lip designs (designer lipstick-brand colorways)');
+console.log('Backend: ' + (process.env.GEN_BACKEND || 'replicate') + ' | Category: lips\n');
+
+let success = 0, fail = 0;
+const ids = [];
+const startedAt = Date.now();
+
+for (let i = 0; i < COLORWAYS.length; i++) {
+ const cw = COLORWAYS[i];
+ const prompt =
+ `Lips Repeat — ${cw.name} colorway. ` +
+ `Ground: solid ${cw.ground_name} (${cw.ground_hex}). ` +
+ `Figure: single-ink ${cw.figure_name} (${cw.figure_hex}) — ALL lip silhouettes in this exact tone. ` +
+ COMPOSITION + ' ' +
+ ANTI_PROMPT;
+
+ console.log('[' + (i+1) + '/' + COLORWAYS.length + '] ' + cw.name + ' (' + cw.ground_hex + ' × ' + cw.figure_hex + ')');
+
+ const r = spawnSync('node', [
+ path.join(__dirname, 'generate_designs.js'),
+ '--n', '1',
+ '--kind', 'seamless_tile',
+ '--category', 'lips',
+ '--prompts', prompt,
+ ], { cwd: ROOT, encoding: 'utf8', env: process.env });
+
+ if (r.status === 0) {
+ success++;
+ const idMatch = (r.stdout || '').match(/design[_ ]id[:= ]?(\d+)/i);
+ if (idMatch) ids.push(parseInt(idMatch[1], 10));
+ process.stdout.write(' ✓\n');
+ } else {
+ fail++;
+ process.stdout.write(' ✗ ' + (r.stderr || r.stdout || '').slice(-300) + '\n');
+ }
+}
+
+const dur = ((Date.now() - startedAt) / 1000).toFixed(1);
+console.log('\nDone: ' + success + ' ok, ' + fail + ' fail in ' + dur + 's');
+console.log('IDs: ' + (ids.length ? ids.join(', ') : '(none parsed)'));
← a607c8b wallco: admin spacing slider on /designs + bleed_guard.js gh
·
back to Wallco Ai
·
night-builder: fix PLACEHOLDER image_url bug in colorway INS f67ea3a →