Release 1.1.0. Everything here came out of using the style picker and finding
the same shape of problem in several places: the connector showed the REST
API's own words to someone who cannot act on them, or showed nothing at all.
Errors, in one place. `friendly_error`/`short_error` (styleref_api.py) rewrite
an API failure as something a node graph can act on — the Login node's Sign in
button, the Search styles… dialog, generate-it-once for a 409 — and Load and
Apply re-raise through them. The raw 401 told users to send an
`Authorization: Bearer` header into ComfyUI's red error window, which has no
buttons at all. `short_error` is the same failure at widget width; the
"loaded style" line used to render the whole paragraph uncut, because the
length guard sat on the success branch only.
The picker:
- Sign in moved to the title row. It changes what the whole dialog can show,
so it is not a property of one list.
- "My styles" hides itself when empty, and its rows now carry the thumbnail,
category and tags a gallery row carries — with visibility (Private /
Link-shared / Public) where a gallery row carries its author. A name on a
blank square sat directly above real cards.
- The gallery lane drops styles you own, so a published style of yours appears
once rather than in both lanes.
- No matches now offers /styles/create instead of a dead end.
- ↓/↑ walk the rows, Enter takes the top hit, Esc closes; query, category and
sort survive between opens.
Load hides `search`/`category` when the dialog is available — they are the
headless fallback, and next to a working button they are the same duplication
the Login node's `action` dropdown was removed for. Picking also clears the
query, which otherwise made every later execution run a search it did not need.
Apply gains a Copy prompt button. Four of its six targets exist to be copied
out of ComfyUI, and the only way to read one in full was to wire up a Preview
Any node. The warning badge now matches any text encoder, not the exact class
`CLIPTextEncode` — SDXL, SD3 and Flux ship their own, so it did nothing on most
real graphs.
Reference Images no longer fails the queue when a style has no inspiration
images: it feeds IPAdapter or a preview, never the sampler, so it reports and
returns an empty batch. `max_images: 0` mutes it without rewiring.
Needs the matching StyleRef-Webapp deploy: the library lane's category, tags
and heroImage come from /api/v1/me/styles, and its search now scores the same
fields the gallery search scores.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
RELEASING.md documents the repeatable update flow this repo has actually used
five times now: bump the version in the four places nothing keeps in sync
automatically, commit and tag here, watch the publish workflow, bump the
monorepo submodule pointer, then verify against the live Registry API and the
real published archive rather than trusting a green check. Two past releases
looked correct in CI and still shipped wrong — model-download metadata in the
wrong JSON key, and thumbnails in a format custom node packs don't read — and
both only surfaced by inspecting what ComfyUI actually saw. That's the reason
step 7 exists instead of stopping at "the workflow succeeded." Also notes the
Flagged-then-clears pattern seen on every version so far, and that
custom-node-list.json in ComfyUI-Manager is a second, unsynced listing.
README gains: mention that Apply/sampler plumbing nodes ship collapsed (already
true in the generated templates), that Apply's node body is where to read the
composed prompt, and the FLUX guidance/sections troubleshooting tip that was
already on the canvas note, now also in the doc someone reads before opening
ComfyUI at all.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The version lived in three places and only one was enforced: pyproject (which
the Registry publishes and the release workflow checks the tag against), the
User-Agent this client sends, and __init__'s fallback for when pyproject cannot
be read. The other two could drift silently, and API telemetry would then
attribute traffic to a version nobody is running. Bumped together, with a test
that fails when they disagree.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
"Plugin" is not ComfyUI's vocabulary. What Manager installs into custom_nodes/
is a custom node pack, and what the Registry publishes is a "node" — so to
someone browsing the Registry, "plugin" reads slightly off-ecosystem, like
calling a VS Code extension an add-on. The README is the listing page, so the
wording is user-facing.
Replaces the eight occurrences with "node pack", "the nodes", or "this pack" as
each sentence reads best. "Extension" stays reserved for its narrow ComfyUI
meaning: the frontend JS registered via app.registerExtension, which is
web/styleref.js and nothing else.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Six comments attributed decisions to "owner decision 2026-07-22", and one test
cited a path inside the private monorepo (PromptFormatDropdown.tsx). Both are
meaningless to anyone reading this repo: an outside contributor has no idea who
the owner is, and cannot open that file. Each comment already gave its reason;
only the attribution goes.
Adds .comfyignore so tests/, scripts/ and .github/ stay in the repo but stay
out of the archive published to the Registry. Installing a pack copies that
archive into custom_nodes/ and leaves it there, and none of those directories
is imported at runtime — __init__.py loads styleref_nodes/* and server_routes
only. workflows/ is deliberately still shipped; the templates are the product.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The root templates ran on SDXL base, where every gallery style washed out. A
full compiled style is ~480 tokens and SDXL's CLIP attends to ~77 per chunk, so
the style was truncated before the sampler saw it. No checkpoint swap fixes
that, Juggernaut included: it is an SDXL finetune with the same encoder.
Root set now runs FLUX.1 dev (Comfy-Org fp8 all-in-one, since BFL's own file is
UNET-only and CheckpointLoaderSimple cannot load it), compiled from the flux
target, whose T5 encoder takes the whole prompt. FluxGuidance 3.5, CFG 1.0, and
ConditioningZeroOut on the negative input: FLUX is guidance distilled and has no
negative channel, exactly like Z-Image. Uses EmptySD3LatentImage because FLUX
works in a 16-channel latent space.
The two sets load different gallery styles on purpose. How well a style demos is
a property of the style and the model together: Z-Image reproduces painterly
technique and keeps the Renaissance style, FLUX is strongest at light and
tonality and takes a noir one.
Also:
- Adds the reference-images template the root set was missing, and renumbers
Facets to 05, so both sets are 01-05 with matching names. Both sets are now
pinned by test against a shared story list.
- Model download metadata moves to each node's properties.models, where ComfyUI
reads it, so a missing checkpoint offers a download instead of being silently
substituted.
- The Load node names the style its slug resolves to, on a read-only row under
style_ref, via a new /styleref/resolve route.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The pack cited internal planning-doc items (plan P3-7, decision D1, plan
risk 9.2) that aren't public, leaving outside contributors with pointers
they can't follow. Each comment already states its reason; only the
dangling citation is removed.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Load, Apply, Facets, Reference Images, and Login nodes for loading StyleRef
creative styles into ComfyUI graphs. Zero runtime dependencies.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>