1.0.5 — per-model demo subjects, and a new FLUX style

The two template sets shared one GRID_SUBJECTS list even though they load
different styles, so the "fully dressed"/"dressed" phrasing was leaking into
the FLUX set. That phrasing exists for Z-Image alone: the Renaissance style
compiles an empty negative and Z-Image has no negative channel to hold one.

Split it into ZIMAGE_GRID_SUBJECTS and FLUX_GRID_SUBJECTS, each with its own
demo subject. Z-Image's three are unchanged. FLUX gets three built around
props, spill and cast shadow.

The FLUX set also moves from Noir Low-Key Portrait to Raw Theatrical
Cinematic (azch4ptx-2ca7d3a07f37) — same reasoning as before (light over
brushwork, subject-agnostic, carries inspiration images), a style whose
staged-clutter identity suits the new subjects.

Known gap: the five FLUX template thumbnails still show the old style and
subjects. They need re-rendering in a follow-up.
This commit is contained in:
Behzad
2026-07-30 00:55:33 +02:00
parent 4862b286a6
commit cec7f9f9cd
10 changed files with 72 additions and 47 deletions
+6 -5
View File
@@ -32,7 +32,7 @@ git clone https://github.com/StyleRef/styleref-comfyui
Restart ComfyUI. Nothing to install: the pack declares no Python dependencies
and imports on the standard library alone. The Reference Images node reaches
for Pillow and numpy when it runs, and every ComfyUI install already ships
those. Look for `[StyleRef] v1.0.4 — 5 nodes registered` in the server console
those. Look for `[StyleRef] v1.0.5 — 5 nodes registered` in the server console
at startup.
**It does depend on styleref.io.** These nodes are a client, not a local
@@ -53,7 +53,7 @@ host outside the API. Nothing here spends credits.
1. Add **StyleRef Load** and paste a slug from the
[gallery](https://styleref.io/gallery) into `style_ref` (try
`72e1zdae-e2d54a18d090`, the Noir Low-Key Portrait style) — or click
`azch4ptx-2ca7d3a07f37`, the Raw Theatrical Cinematic style) — or click
**Search styles…** to pick one.
2. Add **StyleRef Apply**, connect `style`, type a subject, pick your target.
3. Wire `positive` / `negative` into your CLIP Text Encode nodes.
@@ -115,8 +115,9 @@ loader stack. The three model files download on first run.
The two sets load **different gallery styles on purpose.** How well a style
demos is a property of the style *and* the model. FLUX is strongest at light
and tonality, so its templates load a noir style — hard key, crushed blacks,
monochrome. Z-Image reproduces painterly technique faithfully, so its
and colour rather than brushwork, so its templates load a theatrical cinematic
style — hard cast shadows, a saturated key, staged props. Z-Image reproduces
painterly technique faithfully, so its
templates load a Renaissance tempera style. Swap either for any slug from the
[gallery](https://styleref.io/gallery); these are starting points, not
limits.
@@ -145,7 +146,7 @@ worth trying:
1. **`Flux guidance`** (3.5 in the templates, FLUX's default) is the blunt one.
4–5 makes the style bite harder; past that the subject starts losing to it,
and a dark style can go to pure black.
colour goes poster-flat, and a dark style can go to pure black.
2. **Narrow `sections` on StyleRef Apply** to the parts that define this style.
For a period or painterly style that is usually
`artistic_mediums,references,surface_material,colors` — the sections naming
+1 -1
View File
@@ -46,7 +46,7 @@ NODE_DISPLAY_NAME_MAPPINGS = {
# progressive enhancement. Nothing here is required for the nodes to work.
WEB_DIRECTORY = "./web"
_FALLBACK_VERSION = "1.0.4"
_FALLBACK_VERSION = "1.0.5"
def _pack_version() -> str:
+1 -1
View File
@@ -1,6 +1,6 @@
[project]
name = "styleref-comfyui"
version = "1.0.4"
version = "1.0.5"
description = "StyleRef nodes for ComfyUI — load a creative style once, reuse it across your workflows"
authors = [{ name = "StyleRef", email = "hello@styleref.io" }]
readme = "README.md"
+52 -28
View File
@@ -165,10 +165,10 @@ MAX_NOTE = 340
# and it is specifically weak at reproducing painterly technique; the usual
# remedy in the ecosystem is a style LoRA, which is far too much apparatus for
# a first-run demo. Rather than ship a demo that quietly under-delivers, the
# FLUX set uses a style whose identity is *light and tonality* — hard key,
# crushed blacks, monochrome. That is what FLUX is genuinely good at, and
# monochrome high-contrast output is unmistakably styled: nobody has to wonder
# whether the node did anything.
# FLUX set uses a style whose identity is *light and colour* rather than
# brushwork — high contrast, saturated theatrical key, documentary framing.
# That is what FLUX is genuinely good at, and it lands hard enough that nobody
# has to wonder whether the node did anything.
#
# Both are subject-agnostic (the consistency grid needs that) and both carry
# inspiration images (the reference-images template needs that).
@@ -177,7 +177,7 @@ MAX_NOTE = 340
# naturalistic photography style lands close to what a base model does
# unprompted, and a typography-led graphic style asks the sampler for headline
# text. Neither of these does either.
FLUX_STYLE_REF = "72e1zdae-e2d54a18d090" # Noir Low-Key Portrait
FLUX_STYLE_REF = "azch4ptx-2ca7d3a07f37" # Raw Theatrical Cinematic
ZIMAGE_STYLE_REF = "sbdlwwly-66ae1a89efdc" # Renaissance Mythic Classicism
# Placeholder ref for the "your own style" templates. Refs are opaque ids now
@@ -189,12 +189,20 @@ OWN_STYLE_REF = "<your style id>"
# interior, and an object with no figure at all — because the grid's whole
# claim is that one style holds across unrelated subjects.
#
# Two of them say "dressed" outright. That is not prudishness: the Renaissance
# style compiles an empty negative (it carries no guardrails), and Z-Image has
# no negative channel to put one in, so a style steeped in classical painting
# drifts to classical nudes unless the subject says otherwise. Positive
# phrasing in the subject is the only lever either model leaves us.
GRID_SUBJECTS = [
# One list per model, for the same reason the style refs differ: what demos
# well is a property of the model/style pair, not of the subject.
#
# Two of the Z-Image subjects say "dressed" outright. That is not prudishness:
# the Renaissance style compiles an empty negative (it carries no guardrails),
# and Z-Image has no negative channel to put one in, so a style steeped in
# classical painting drifts to classical nudes unless the subject says
# otherwise. Positive phrasing in the subject is the only lever that model
# leaves us. FLUX needs none of that — Raw Theatrical Cinematic carries its own
# guardrails and FLUX has a channel for them — so its subjects are chosen
# instead for what the style is actually about: hard cast shadows, a saturated
# key, narrative props and "staged chaos" (spilled cherries and juice in the
# fabric, a fridge door throwing the only fill, a sprinkler on a flat lawn).
ZIMAGE_GRID_SUBJECTS = [
"A fully dressed teenager sitting on a rooftop ledge at dusk, dress in "
"#8A9FB5 color with ropes, knees up, headphones on, looking out over a "
"low-rise city as lights begin to switch on; laundry lines and a water "
@@ -203,9 +211,25 @@ GRID_SUBJECTS = [
"A Unicorn Toy",
]
# The single-subject templates all use the first grid subject, so a user who
# opens two templates sees the same prompt render consistently.
DEMO_SUBJECT = GRID_SUBJECTS[0]
FLUX_GRID_SUBJECTS = [
"A picnic blanket spread out across grass, covered with a half-eaten "
"watermelon slice, a tipped bowl of cherries spilling across the stripes, "
"a transistor radio, sunglasses, and a paperback splayed face-down. Seeds "
"and rind scattered between them, juice soaked dark into the fabric.",
"A woman in a robe and hair curlers sitting on a kitchen floor with her "
"back against the cabinets, eating spaghetti straight from the pot. A "
"wooden spoon on the tile beside her, an open fridge door casting into "
"frame.",
"A woman in a yellow raincoat and boots holding an open umbrella, standing "
"on a bright green lawn under a garden sprinkler, cloudless sky above. A "
"watering can and a pair of sandals on the grass beside her.",
]
# The single-subject templates use their own set's first grid subject, so a
# user who opens two templates for the same model sees the same prompt render
# consistently.
ZIMAGE_DEMO_SUBJECT = ZIMAGE_GRID_SUBJECTS[0]
FLUX_DEMO_SUBJECT = FLUX_GRID_SUBJECTS[0]
# Frontend model-download metadata: a missing checkpoint becomes a guided
# download instead of a red error.
@@ -469,10 +493,10 @@ def _flux_tail(graph: Graph, apply_node: int, checkpoint: int, col: int) -> None
# FLUX's own default. It briefly shipped at 5.0 here, to force a painterly
# style that FLUX was never going to reproduce; with a style the model is
# actually good at, that compensation stops helping and starts costing the
# subject. This style asks for crushed blacks and no fill, and guidance is
# a blunt "obey harder" dial — over-driven, the frame goes to pure black and
# the subject dissolves into it. Style adherence is the pairing's job, not
# this number's.
# subject. Guidance is a blunt "obey harder" dial, and this style already
# asks for a saturated key and hard shadows — over-driven, the colour goes
# poster-flat and the staged clutter collapses into contrast. Style
# adherence is the pairing's job, not this number's.
guidance = graph.place("FluxGuidance", col, [3.5], title="Flux guidance")
zero_out = graph.place("ConditioningZeroOut", col, [], title="FLUX has no negative")
latent = graph.place("EmptySD3LatentImage", col, [1024, 1024, 1])
@@ -627,7 +651,7 @@ def workflow_zimage_01_quickstart() -> dict[str, Any]:
)
unet, clip, vae = _zimage_loaders(g)
apply_node = g.place(
"StyleRefApply", 1, apply_widgets(DEMO_SUBJECT, "diffusion")
"StyleRefApply", 1, apply_widgets(ZIMAGE_DEMO_SUBJECT, "diffusion")
)
g.link(load, 0, apply_node, 0)
_zimage_tail(g, apply_node, unet, clip, vae, col=2)
@@ -648,7 +672,7 @@ def workflow_zimage_02_consistency() -> dict[str, Any]:
load = g.place("StyleRefLoad", 0, load_widgets(ZIMAGE_STYLE_REF))
unet, clip, vae = _zimage_loaders(g)
subjects = GRID_SUBJECTS
subjects = ZIMAGE_GRID_SUBJECTS
for index, subject in enumerate(subjects):
apply_node = g.place(
"StyleRefApply", 1, apply_widgets(subject, "diffusion"), title=f"Subject {index + 1}"
@@ -678,7 +702,7 @@ def workflow_zimage_03_your_own_style() -> dict[str, Any]:
)
unet, clip, vae = _zimage_loaders(g)
apply_node = g.place(
"StyleRefApply", 1, apply_widgets(DEMO_SUBJECT, "diffusion")
"StyleRefApply", 1, apply_widgets(ZIMAGE_DEMO_SUBJECT, "diffusion")
)
g.link(load, 0, apply_node, 0)
_zimage_tail(g, apply_node, unet, clip, vae, col=2)
@@ -708,7 +732,7 @@ def workflow_zimage_04_reference_images() -> dict[str, Any]:
g.link(refs, 0, ref_preview, 0)
apply_node = g.place(
"StyleRefApply", 1, apply_widgets(DEMO_SUBJECT, "diffusion")
"StyleRefApply", 1, apply_widgets(ZIMAGE_DEMO_SUBJECT, "diffusion")
)
g.link(load, 0, apply_node, 0)
_zimage_tail(g, apply_node, unet, clip, vae, col=2)
@@ -737,7 +761,7 @@ def workflow_01_quickstart() -> dict[str, Any]:
)
checkpoint = _flux_checkpoint(g)
apply_node = g.place(
"StyleRefApply", 1, apply_widgets(DEMO_SUBJECT, "flux")
"StyleRefApply", 1, apply_widgets(FLUX_DEMO_SUBJECT, "flux")
)
g.link(load, 0, apply_node, 0)
_flux_tail(g, apply_node, checkpoint, col=2)
@@ -764,7 +788,7 @@ def workflow_02_consistency() -> dict[str, Any]:
load = g.place("StyleRefLoad", 0, load_widgets(FLUX_STYLE_REF))
checkpoint = _flux_checkpoint(g)
subjects = GRID_SUBJECTS
subjects = FLUX_GRID_SUBJECTS
for index, subject in enumerate(subjects):
apply_node = g.place(
"StyleRefApply", 1, apply_widgets(subject, "flux"), title=f"Subject {index + 1}"
@@ -797,7 +821,7 @@ def workflow_03_your_own_style() -> dict[str, Any]:
)
checkpoint = _flux_checkpoint(g)
apply_node = g.place(
"StyleRefApply", 1, apply_widgets(DEMO_SUBJECT, "flux")
"StyleRefApply", 1, apply_widgets(FLUX_DEMO_SUBJECT, "flux")
)
g.link(load, 0, apply_node, 0)
_flux_tail(g, apply_node, checkpoint, col=2)
@@ -835,7 +859,7 @@ def workflow_04_reference_images() -> dict[str, Any]:
g.link(refs, 0, ref_preview, 0)
apply_node = g.place(
"StyleRefApply", 1, apply_widgets(DEMO_SUBJECT, "flux")
"StyleRefApply", 1, apply_widgets(FLUX_DEMO_SUBJECT, "flux")
)
g.link(load, 0, apply_node, 0)
_flux_tail(g, apply_node, checkpoint, col=2)
@@ -858,7 +882,7 @@ def workflow_05_facets() -> dict[str, Any]:
_facet_board(g, load, col=1)
apply_node = g.place(
"StyleRefApply", 3, apply_widgets(DEMO_SUBJECT, "flux")
"StyleRefApply", 3, apply_widgets(FLUX_DEMO_SUBJECT, "flux")
)
g.link(load, 0, apply_node, 0)
_flux_tail(g, apply_node, checkpoint, col=4)
@@ -881,7 +905,7 @@ def workflow_zimage_05_facets() -> dict[str, Any]:
_facet_board(g, load, col=1)
apply_node = g.place(
"StyleRefApply", 3, apply_widgets(DEMO_SUBJECT, "diffusion")
"StyleRefApply", 3, apply_widgets(ZIMAGE_DEMO_SUBJECT, "diffusion")
)
g.link(load, 0, apply_node, 0)
_zimage_tail(g, apply_node, unet, clip, vae, col=4)
+1 -1
View File
@@ -25,7 +25,7 @@ SITE_URL = "https://styleref.io"
# Identifies this surface in StyleRef's API telemetry (recordApiCall reads it).
CLIENT_TAG = "comfyui"
USER_AGENT = "styleref-comfyui/1.0.4 (+https://styleref.io)"
USER_AGENT = "styleref-comfyui/1.0.5 (+https://styleref.io)"
DEFAULT_TIMEOUT_S = 30
+2 -2
View File
@@ -61,7 +61,7 @@
"Node name for S&R": "StyleRefLoad"
},
"widgets_values": [
"72e1zdae-e2d54a18d090",
"azch4ptx-2ca7d3a07f37",
"",
"any",
true,
@@ -171,7 +171,7 @@
"Node name for S&R": "StyleRefApply"
},
"widgets_values": [
"A fully dressed teenager sitting on a rooftop ledge at dusk, dress in #8A9FB5 color with ropes, knees up, headphones on, looking out over a low-rise city as lights begin to switch on; laundry lines and a water tank frame the foreground.",
"A picnic blanket spread out across grass, covered with a half-eaten watermelon slice, a tipped bowl of cherries spilling across the stripes, a transistor radio, sunglasses, and a paperback splayed face-down. Seeds and rind scattered between them, juice soaked dark into the fabric.",
"flux",
"",
false,
+4 -4
View File
@@ -63,7 +63,7 @@
"Node name for S&R": "StyleRefLoad"
},
"widgets_values": [
"72e1zdae-e2d54a18d090",
"azch4ptx-2ca7d3a07f37",
"",
"any",
true,
@@ -178,7 +178,7 @@
"Node name for S&R": "StyleRefApply"
},
"widgets_values": [
"A fully dressed teenager sitting on a rooftop ledge at dusk, dress in #8A9FB5 color with ropes, knees up, headphones on, looking out over a low-rise city as lights begin to switch on; laundry lines and a water tank frame the foreground.",
"A picnic blanket spread out across grass, covered with a half-eaten watermelon slice, a tipped bowl of cherries spilling across the stripes, a transistor radio, sunglasses, and a paperback splayed face-down. Seeds and rind scattered between them, juice soaked dark into the fabric.",
"flux",
"",
false,
@@ -524,7 +524,7 @@
"Node name for S&R": "StyleRefApply"
},
"widgets_values": [
"two friends flipping through crates of vinyl in a record shop, dressed",
"A woman in a robe and hair curlers sitting on a kitchen floor with her back against the cabinets, eating spaghetti straight from the pot. A wooden spoon on the tile beside her, an open fridge door casting into frame.",
"flux",
"",
false,
@@ -870,7 +870,7 @@
"Node name for S&R": "StyleRefApply"
},
"widgets_values": [
"A Unicorn Toy",
"A woman in a yellow raincoat and boots holding an open umbrella, standing on a bright green lawn under a garden sprinkler, cloudless sky above. A watering can and a pair of sandals on the grass beside her.",
"flux",
"",
false,
+1 -1
View File
@@ -200,7 +200,7 @@
"Node name for S&R": "StyleRefApply"
},
"widgets_values": [
"A fully dressed teenager sitting on a rooftop ledge at dusk, dress in #8A9FB5 color with ropes, knees up, headphones on, looking out over a low-rise city as lights begin to switch on; laundry lines and a water tank frame the foreground.",
"A picnic blanket spread out across grass, covered with a half-eaten watermelon slice, a tipped bowl of cherries spilling across the stripes, a transistor radio, sunglasses, and a paperback splayed face-down. Seeds and rind scattered between them, juice soaked dark into the fabric.",
"flux",
"",
false,
+2 -2
View File
@@ -62,7 +62,7 @@
"Node name for S&R": "StyleRefLoad"
},
"widgets_values": [
"72e1zdae-e2d54a18d090",
"azch4ptx-2ca7d3a07f37",
"",
"any",
true,
@@ -245,7 +245,7 @@
"Node name for S&R": "StyleRefApply"
},
"widgets_values": [
"A fully dressed teenager sitting on a rooftop ledge at dusk, dress in #8A9FB5 color with ropes, knees up, headphones on, looking out over a low-rise city as lights begin to switch on; laundry lines and a water tank frame the foreground.",
"A picnic blanket spread out across grass, covered with a half-eaten watermelon slice, a tipped bowl of cherries spilling across the stripes, a transistor radio, sunglasses, and a paperback splayed face-down. Seeds and rind scattered between them, juice soaked dark into the fabric.",
"flux",
"",
false,
+2 -2
View File
@@ -62,7 +62,7 @@
"Node name for S&R": "StyleRefLoad"
},
"widgets_values": [
"72e1zdae-e2d54a18d090",
"azch4ptx-2ca7d3a07f37",
"",
"any",
true,
@@ -525,7 +525,7 @@
"Node name for S&R": "StyleRefApply"
},
"widgets_values": [
"A fully dressed teenager sitting on a rooftop ledge at dusk, dress in #8A9FB5 color with ropes, knees up, headphones on, looking out over a low-rise city as lights begin to switch on; laundry lines and a water tank frame the foreground.",
"A picnic blanket spread out across grass, covered with a half-eaten watermelon slice, a tipped bowl of cherries spilling across the stripes, a transistor radio, sunglasses, and a paperback splayed face-down. Seeds and rind scattered between them, juice soaked dark into the fabric.",
"flux",
"",
false,