← back to Wallco Ai
Fix 3: inject SeamlessTile node into workflow for tile categories (Mac1 ComfyUI spinagon/seamless-tiling@9225ed5d)
d2291bc94b5c87071426628fa38f08a5bbd53d38 · 2026-05-26 09:23:15 -0700 · Steve Abrams
Files touched
M scripts/generate_designs.js
Diff
commit d2291bc94b5c87071426628fa38f08a5bbd53d38
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Tue May 26 09:23:15 2026 -0700
Fix 3: inject SeamlessTile node into workflow for tile categories (Mac1 ComfyUI spinagon/seamless-tiling@9225ed5d)
---
scripts/generate_designs.js | 22 +++++++++++++++++++---
1 file changed, 19 insertions(+), 3 deletions(-)
diff --git a/scripts/generate_designs.js b/scripts/generate_designs.js
index dc98086..13bccdb 100644
--- a/scripts/generate_designs.js
+++ b/scripts/generate_designs.js
@@ -312,6 +312,15 @@ function genComfy(prompt, seed, outPath, meta) {
const STEPS = parseInt(process.env.COMFY_STEPS || '30', 10);
const SWITCH = Math.round(STEPS * 0.8); // base → refiner handoff at 80%
+ // 2026-05-26 — SeamlessTile node wraps the model with circular Conv2D padding
+ // so SDXL produces truly tileable output. Conditional on TILE_CATEGORIES because
+ // figure-on-ground categories (drunk-animals, designer-bugs) shouldn't have
+ // the figure wrap around the tile edge. Requires spinagon/ComfyUI-seamless-tiling
+ // installed on the target ComfyUI (Mac1 commit 9225ed5d).
+ const tileable = !!(meta && TILE_CATEGORIES.has(meta.category));
+ const BASE_MODEL_REF = tileable ? ['1000', 0] : ['4', 0];
+ const REFINER_MODEL_REF = tileable ? ['1001', 0] : ['15', 0];
+
let workflow;
if (REFINER) {
workflow = {
@@ -322,14 +331,18 @@ function genComfy(prompt, seed, outPath, meta) {
'7': { class_type: 'CLIPTextEncode', inputs: { text: negativePrompt, clip: ['4', 1] } },
'16': { class_type: 'CLIPTextEncode', inputs: { text: positivePrompt, clip: ['15', 1] } },
'17': { class_type: 'CLIPTextEncode', inputs: { text: negativePrompt, clip: ['15', 1] } },
- '10': { class_type: 'KSamplerAdvanced', inputs: { add_noise: 'enable', noise_seed: seed, steps: STEPS, cfg: 8.5, sampler_name: 'dpmpp_2m_sde', scheduler: 'karras', start_at_step: 0, end_at_step: SWITCH, return_with_leftover_noise: 'enable', model: ['4', 0], positive: ['6', 0], negative: ['7', 0], latent_image: ['5', 0] } },
- '11': { class_type: 'KSamplerAdvanced', inputs: { add_noise: 'disable', noise_seed: seed, steps: STEPS, cfg: 8.5, sampler_name: 'dpmpp_2m_sde', scheduler: 'karras', start_at_step: SWITCH, end_at_step: 10000, return_with_leftover_noise: 'disable', model: ['15', 0], positive: ['16', 0], negative: ['17', 0], latent_image: ['10', 0] } },
+ '10': { class_type: 'KSamplerAdvanced', inputs: { add_noise: 'enable', noise_seed: seed, steps: STEPS, cfg: 8.5, sampler_name: 'dpmpp_2m_sde', scheduler: 'karras', start_at_step: 0, end_at_step: SWITCH, return_with_leftover_noise: 'enable', model: BASE_MODEL_REF, positive: ['6', 0], negative: ['7', 0], latent_image: ['5', 0] } },
+ '11': { class_type: 'KSamplerAdvanced', inputs: { add_noise: 'disable', noise_seed: seed, steps: STEPS, cfg: 8.5, sampler_name: 'dpmpp_2m_sde', scheduler: 'karras', start_at_step: SWITCH, end_at_step: 10000, return_with_leftover_noise: 'disable', model: REFINER_MODEL_REF, positive: ['16', 0], negative: ['17', 0], latent_image: ['10', 0] } },
'8': { class_type: 'VAEDecode', inputs: { samples: ['11', 0], vae: ['15', 2] } },
'9': { class_type: 'SaveImage', inputs: { filename_prefix: `wallco_${seed}`, images: ['8', 0] } }
};
+ if (tileable) {
+ workflow['1000'] = { class_type: 'SeamlessTile', inputs: { model: ['4', 0], tiling: 'enable', copy_model: 'Make a copy' } };
+ workflow['1001'] = { class_type: 'SeamlessTile', inputs: { model: ['15', 0], tiling: 'enable', copy_model: 'Make a copy' } };
+ }
} else {
workflow = {
- '3': { class_type: 'KSampler', inputs: { seed, steps: 28, cfg: 8.5, sampler_name: 'dpmpp_2m_sde', scheduler: 'karras', denoise: 1.0, model: ['4', 0], positive: ['6', 0], negative: ['7', 0], latent_image: ['5', 0] } },
+ '3': { class_type: 'KSampler', inputs: { seed, steps: 28, cfg: 8.5, sampler_name: 'dpmpp_2m_sde', scheduler: 'karras', denoise: 1.0, model: BASE_MODEL_REF, positive: ['6', 0], negative: ['7', 0], latent_image: ['5', 0] } },
'4': { class_type: 'CheckpointLoaderSimple', inputs: { ckpt_name: MODEL } },
'5': { class_type: 'EmptyLatentImage', inputs: { width: WIDTH, height: HEIGHT, batch_size: 1 } },
'6': { class_type: 'CLIPTextEncode', inputs: { text: positivePrompt, clip: ['4', 1] } },
@@ -337,6 +350,9 @@ function genComfy(prompt, seed, outPath, meta) {
'8': { class_type: 'VAEDecode', inputs: { samples: ['3', 0], vae: ['4', 2] } },
'9': { class_type: 'SaveImage', inputs: { filename_prefix: `wallco_${seed}`, images: ['8', 0] } }
};
+ if (tileable) {
+ workflow['1000'] = { class_type: 'SeamlessTile', inputs: { model: ['4', 0], tiling: 'enable', copy_model: 'Make a copy' } };
+ }
}
// Submit
← 2b58f6b geometric pilot: bulk-generated 20 designs (verification def
·
back to Wallco Ai
·
scripts: bump dead admin-reload port 9792 → 9878 across 18 b 11887e5 →