ComfyUI Node

AniPro Builder

A Danbooru Tag Picker That Lives Inside Your Graph

By shibadogday·Created 2 days ago·Updated 2 days ago· 3
AniPro Builder
    • positive
    • negative
    ◄state►

    What it's actually for

    Anima is the first anime model in years that made people switch, and the reason is the encoder: Qwen3-0.6B instead of CLIP, so it reads real Danbooru tags and plain English sentences with roughly equal competence. The catch is that tag order still does work. The official card wants quality/meta tags first, then character count, character, series, artist, then general - and reordering the same words can fix which character is doing what in a two-person scene. A prompt isn't a bag of tags here. It's a sorted list in categories you have to remember.

    AniPro Builder is a visual picker for exactly that job. Tags are colour-coded by Danbooru category (general, artist, copyright, character, meta), each links out to its Danbooru wiki page, you drag them into order, and each carries a weight you can nudge from 0 to 2. It'll also import an existing prompt - masterpiece, 1girl, (hatsune miku:1.2), @artist, ... - and guess which tags go positive and which go negative. Out comes two plain strings for your text encoders.

    One honest thing up front: this pack is two days old as I write this. Repo created 2026-10-17, three stars, four registry downloads, no README, no Reddit footprint at all. You're early - which is fine, but it means nobody to ask when it misbehaves.

    How it works: it's a website in a box

    The Python side is about forty lines and does one thing: json.loads the state widget, pull out two keys, return them. No model, no tokenizer, no dependency. The node class is AnimaPromptBuilder, displayed as "AniPro Builder", filed under conditioning.

    The clever part isn't local, though. The actual builder is a remote web app - https://anipro.shibadog.day/, titled あにぷろビルダー, so expect some Japanese in the labelling. The pack's frontend extension hides the state widget, drops a DOM widget onto the node, and points an iframe at that site with ?embed=comfyui on the URL. Then a small postMessage handshake runs: the app says it's ready, the node hands over the current state string, and every edit in the app posts a new state back, which the node writes into the hidden widget and marks the workflow dirty. So the JSON you see serialized in your workflow is the app's own state blob - including tag order and weights - but the node only surfaces the positive and negative strings.

    The inputs and outputs

    There is exactly one input, and you'll almost never touch it.

    • state (STRING, required, defaults to empty) - the hidden JSON blob. Leave it alone and the iframe owns it.
    • Outputs are positive and negative, both STRING. Wire them into your positive and negative CLIPTextEncode nodes (or whatever Anima encoder chain you're using).

    The state input being plain JSON is a feature when you're scripting. For a batch or API run you can set it by hand and never open the iframe:

    {"positive": "masterpiece, 1girl, hatsune miku, ...", "negative": "worst quality, low quality, ..."}
    

    An empty string is legal and returns two empty ones. Invalid JSON throws Cannot read the AniPro Builder state: ... at execution, so keep it a dict with two string values.

    Install

    It's on the registry as anima-prompt-builder, so ComfyUI Manager can find it - search the pack title "Anima Prompt Builder". Manual is the usual:

    cd ComfyUI/custom_nodes
    git clone https://github.com/shibadogday/anima-prompt-builder-comfy-node
    

    Then restart ComfyUI. No requirements.txt, no pip step, no model downloads - the registry entry lists zero dependencies and the Python imports nothing but json. Genuinely rare here. Restart anyway; the frontend half only loads on a fresh page load.

    Settings, and the one thing that will break

    There's a single setting: Settings → AniPro Builder → Connection → URL, defaulting to the author's hosted app. The tooltip is explicit that you click Reload on the node afterwards. It exists because the builder is someone else's server: self-host or mirror it and that's your lever.

    The failure mode follows directly. No internet, a corporate proxy, or the site going down, and you get a blank white rectangle where the builder should be - while the node happily keeps running on whatever state it last held. There's an Open in new tab button on the node for exactly this: check the site loads before you debug ComfyUI. Your workflow isn't lost when the site is down - the state is serialized into it.

    Two more things. The node forces itself to at least 900×640, so it'll elbow your graph around when you first drop it in. And those per-tag weights emit the familiar (tag:1.2) syntax, but Anima's Qwen3 encoder doesn't implement ComfyUI prompt weighting - parentheses and colons get fed through as literal punctuation. If a tag won't stick, reorder it or say it in words instead of cranking the slider. Not this node's fault, but it's where the UI invites you to waste an afternoon.

    Categoryconditioning

    Inputs (1)

    NameTypeDefaultDescription
    stateSTRING—

    Outputs (2)

    NameTypeDescription
    positiveSTRING—
    negativeSTRING—