Nodes/ComfyUI-Rennart/Rennart Art Color Wheel
ComfyUI Node

Rennart Art Color Wheel

A Color Wheel That Thinks Like a Painter, Not Like a Slider

By Rennart2025·Created 12 days ago·Updated a day ago· 2
Rennart Art Color Wheel
    • colors_csv
    • colors
    • ideogram_json
    palette_typeTriad
    color_count3
    wheel_data[]

    If you've ever begged a model for "a harmonious blue-and-orange palette" and watched it hand you cyan and neon pink, you've learned the lesson the hard way: diffusion reads hex codes far more reliably than it reads adjectives. RennartArtColorWheel is the antidote. It drops a real, draggable color wheel onto your canvas, applies the classic harmony rules from color theory, and spits out ready-to-paste HEX codes - so your palette is decided by you and actual color science, not by whatever the sampler hallucinates from your prose.

    The node is part of the small ComfyUI-Rennart pack, and honestly the pack is what most color-adjacent ComfyUI setups are missing: Comfy's stock nodes will happily sample, upscale, and mask, but nothing built-in helps you choose colors. This one does.

    How it works

    Here's the part that's easy to miss: the node is mostly a frontend. The real logic - drawing the wheel, dragging markers, computing hex - lives in a JavaScript widget (web/js/rennart_art_color_wheel.js), and the Python class is just a thin envelope that declares inputs, parses the JSON the widget wrote, and passes colors out. The wheel itself is an RYB "artist's" wheel (red/yellow/blue primaries, green opposite red), not the RGB one your monitor uses. The widget maps that painter's hue onto scientific HSV before converting to hex, which is why a "complementary" pair from this node looks right to a human eye in a way a naive 180°-on-HSV picker doesn't.

    Drag the root marker and the other markers are locked to their harmony rays: complementary sits 180° away, triad 120°, tetradic 90° (Square was removed because it duplicated tetradic). Crank color_count past the number of rays and extra colors "echo" down the same ray at stepped-down saturation and brightness - the code has confirmed levels at 66/67 and 50/50, with a gentler decay beyond. Each marker gets its own row with a swatch, its hex readout, and H/S/B sliders if you want to fine-tune instead of drag.

    The inputs that matter

    Only three inputs, and two of them are the whole show:

    • palette_type - Complementary, Analogous, Triad, Split-Complementary, Double Split-Complementary, Tetradic, Monochromatic, or Custom (free dragging, no ray locking). Default is Triad.
    • color_count - 2 to 10. The widget silently enforces each harmony's minimum (tetradic needs 4, double split-complementary needs 5), so don't fight it.
    • wheel_data - hidden text field where the widget stashes the chosen hex list as JSON like ["#FF0000", "#00FFFF"]. You'll almost never touch it directly.

    Outputs and where they go

    Three outputs, same colors three ways:

    • colors_csv - a plain comma-joined string, handy for pasting into a text prompt ("#C44E22, #2B6FA3, …").
    • colors - the same list as actual STRING outputs (one wire slot per color), so you can route individual hex codes to whatever prompt-builder or color-grading node you're chaining into.
    • ideogram_json - {"color_palette": [...]} as a JSON string, aimed at models that condition on structured captions - think Ideogram 4, whose caption schema takes hex palettes alongside boxes and text. This node only hands you the palette chunk; the boxes-and-layout half of that caption is still your job.

    Install

    ComfyUI Manager is the easy path - search "ComfyUI-Rennart" and install. Or go manual:

    cd ComfyUI/custom_nodes
    git clone https://github.com/Rennart2025/ComfyUI-Rennart
    

    Restart ComfyUI. No model downloads, no API key, nothing heavy: the declared dependencies (torch, numpy, pillow) are already part of ComfyUI, and the node runs fully offline.

    Where people get burned

    The big trap is headless runs. Everything you pick on the wheel is stored only in wheel_data - if you queue the workflow via the API or run it before ever opening the node's UI, that field is still "[]", and the Python side silently substitutes an evenly-spaced fallback rainbow. Handy that it doesn't crash; annoying that it's not your palette. Save the workflow after you've set your colors, and if you're scripting, set wheel_data explicitly.

    Two smaller notes: hex output is uppercase, and this gives you an accent palette for prompt conditioning and grading - not per-region pixel control. For that you still need masking or a layout-aware model. As a "pick coherent colors, hand them to the prompt" tool, though, it's the one I'd reach for - and because everything is baked into saved workflows, your palettes travel with the graph.

    CategoryRennart/Color

    Inputs (3)

    NameTypeDefaultDescription
    palette_typeCOMBOTriad8 options: Complementary, Analogous, Triad, Split-Complementary, Double Split-Complementary, Tetradic, +2
    color_countINT32–10
    wheel_dataSTRING[]

    Outputs (3)

    NameTypeDescription
    colors_csvSTRING
    colorsSTRING
    ideogram_jsonSTRING