SPS logo

SPS Dev Tool Guides

Shared AI infrastructure for the Sand Point Studios dev team

ComfyUI + FLUX — image generation

What it is. ComfyUI is a node-graph UI for diffusion models — you wire up a workflow (model loader → text encoders → sampler → decoder → save) and run it. FLUX.1-schnell is the model: 12B parameters, 4-step inference (~5-15 seconds per image on the right GPU), Apache 2.0, top-tier quality for most styles. Together they replace your DALL·E spend with unlimited free generation.

Where it lives

Location URL Auth
sps-srv1 service (shared) https://comfy.sandpointstudios.ltd CF Access (Google SSO, @sandpointstudios.ltd)
sps-srv1 LAN http://vigil-server:8188 None
laptop cd C:\Users\twist\AppData\Local\ComfyUI; run.bathttp://localhost:8188 None

Models stored at /backup/comfyui-flux/models/ on sps-srv1 (auto-mounted into the container). Laptop models go in C:\Users\twist\AppData\Local\ComfyUI\ComfyUI\models\ once you download them.

When to use ComfyUI/FLUX vs. DALL·E

Use ComfyUI/FLUX when: - Generating multiple variations to pick from (free; DALL·E charges per image) - Need consistent characters/style across many images (LoRAs solve this; DALL·E doesn't) - Brand-specific art (you can train a LoRA on existing assets for style consistency) - Workflows you can save and rerun: "card art for Right Bower" with the same prompt template across 24 cards

Keep using DALL·E when: - One-off hero image for a marketing page (DALL·E's "AI website look" handles certain compositional styles FLUX struggles with — the auto-rendered "abstract concept" type) - Speed matters more than quality control (DALL·E is faster than FLUX-on-2060S right now)

The current GPU caveat

sps-srv1 ComfyUI is currently pinned to the RTX 2060 SUPER (8 GB) because the prebuilt image's PyTorch doesn't support Blackwell sm_120. The RTX 5090 (32 GB) is idle. Until that's resolved: - FLUX schnell fp8 (the model on disk) won't actually run — it needs ~12 GB - Workaround: download flux1-schnell-Q4_K_S.gguf (~6 GB) from city96/FLUX.1-schnell-gguf on HF; use a UnetLoaderGGUF node instead of UNETLoader. Owed follow-up. - Laptop ComfyUI doesn't have this problem — torch 2.11+cu128 on the 5080 supports Blackwell fully. The 16 GB VRAM fits FLUX schnell fp8 directly.

3 recipes

1. Generate a Wyrdlyre character portrait (browser, sps-srv1)

  1. Go to https://comfy.sandpointstudios.ltd, sign in with @sandpointstudios.ltd Google account
  2. Top-right menu → Workflow → Open → load /backup/comfyui-flux/workflows/flux-schnell-template.json (or drag the file in)
  3. In the CLIPTextEncode node, replace the placeholder text with your character prompt: "A weathered halfling rogue with auburn hair tied back, leather armor, leaning on a polished oak quarterstaff, soft tavern lamplight, oil-painting style, character portrait, head and shoulders"
  4. Click Queue Prompt (top right)
  5. Output saves to /backup/comfyui-flux/output/ on sps-srv1; you also see a preview in the SaveImage node

2. Batch-generate 24 card images for Right Bower (script)

import requests, json, time

with open("flux-schnell-template.json") as f:
    workflow = json.load(f)

cards = [
    ("hearts", "ace"), ("hearts", "king"), ("hearts", "queen"), ...
]

for suit, rank in cards:
    workflow["4"]["inputs"]["text"] = (
        f"playing card art, {rank} of {suit}, art-nouveau border, "
        "stylized illustration, no text, vibrant colors"
    )
    workflow["6"]["inputs"]["seed"] = hash((suit, rank)) % (2**32)  # deterministic
    workflow["8"]["inputs"]["filename_prefix"] = f"rightbower-{suit}-{rank}"

    r = requests.post("http://vigil-server:8188/prompt", json={"prompt": workflow})
    r.raise_for_status()
    time.sleep(15)  # let it generate before queuing next

This is the workflow JSON pattern — load template, mutate the prompt + filename, POST to /prompt.

3. Iterate on a prompt (laptop, browser)

  1. run.bat from C:\Users\twist\AppData\Local\ComfyUI\ → browser opens to http://localhost:8188
  2. Load the same template JSON
  3. Right-click any node → Properties to tweak. The fastest iterations:
  4. Change the seed (KSampler node) → different composition, same prompt
  5. Add --ar 9:16 style portrait/landscape by changing EmptyLatentImage width/height
  6. Add a negative prompt by duplicating the CLIPTextEncode and wiring it to KSampler's negative input

Laptop generation: ~10-15 seconds per image on the 5080.

Gotchas