ποΈ Subject Manager
Your character library lives inside the graph now
- subject_data
If you're chasing character consistency in multimodal video models, you've probably hit the same wall this node was built for: holding a stable set of reference images, audio clips, and prompts together and getting them into the model in the right order. Subject Manager is the filing cabinet for that - a full asset-management UI that lives right inside the ComfyUI canvas instead of in a sidecar app.
The name is a little funny once you look under the hood. The Python side of SubjectManagerNode is nearly a no-op: its process() method takes subject_data and returns it unchanged. Almost everything you see - the category tabs, the drag-and-drop media slots, the waveform trimmers, the tag drawer - is a JavaScript widget shipped in the pack's web/ directory. In practice the node is its UI, and that's fine, because that UI is the whole point.
What it's actually for
This pack is aimed squarely at MiniMax H3, the 33B omni-modal video model that takes text, images, audio, and video as one unified reference context. Character consistency has been the community's #1 unsolved problem for years, and H3's whole pitch is that you hand it a picture of your character plus a prompt and it keeps them recognizably the same across a clip. The pain this solves is bookkeeping: keeping "Fic", "Bob", "Car", and "Village" as organized cards, each with its own images, outfit tags, voice timbre, and acting reference, then rolling them into the right prompt slot on demand.
The README frames it as a library of Characters, Objects, and Environments, each with color-coded sections, solo-select or always-on (β) selection, and a per-section π² queue randomization driven by a deterministic seed. You don't just store a picture - you tag what role it plays (face/ID, outfit, turnaround, voice timbre, foley), and the pack generates the matching prompt segment for you.
The inputs that matter
There are only two, and you'll almost never touch either directly:
subject_data- a STRING holding the whole library as JSON. The default payload is a demo library (Fic, Bob, Car, Village) so you can see the format immediately. Don't hand-edit this in the node; that's what the widget is for.seed- an INT feeding the queue-randomization rolls. Same seed, same "random" selection, so you can reproduce a draw.
The output
One output: subject_data of type SUBJECT_DATA, which you wire straight into SubjectUnpackNode. That's the whole pipeline - Manager is upstream of everything.
Installing it
No model downloads, no heavy dependencies - this is a pure utility pack, and its pyproject.toml declares zero dependencies. Either use ComfyUI Manager (search "Subject Manager" / Fictiverse) or:
cd ComfyUI/custom_nodes/
git clone https://github.com/Fictiverse/ComfyUI_Subject_Manager.git
Then restart ComfyUI. One thing worth knowing: presets and their media are stored inside the pack folder (custom_nodes/ComfyUI_Subject_Manager/presets/), not your user directory. That means a pack update or reinstall can orphan your library, so use the pack's zip export (it bundles presets with all media, auto-compressing PNGs to JPEG 80% and WAVs to MP3) if you care about what you've built. The import side is hardened against path traversal, which is more than most custom nodes bother with.
Author-wise, Fictiverse is a long-time hobbyist in this space - the same handle behind Redream, a realtime-diffusion GUI from back in the A1111 era. This pack reads like a project someone built because they were making H3 content every day, not because they wanted a marketplace hit.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| subject_data | STRING | {"sections": [{"key": "subjects", "label": "Characters", "enabled": true, "randomizeOnQueue": false, "color": "amber"}, {"key": "objects", "label": "Objects", "enabled": true, "randomizeOnQueue": false, "color": "red"}, {"key": "scenes", "label": "Scenes", "enabled": true, "randomizeOnQueue": false, "color": "green"}], "categories": {"subjects": [{"id": "s_ujjeivemt1oj4nt", "name": "Fic", "subjectType": "character", "prompt": "<Picture 1> defines <Subject 1>'s anatomical height, silhouette proportions, and physical build, and exact garment design, fabric weave, and color scheme, and multi-angle 360\u00b0 turnaround 3D consistency.\n<Subject 1> must remain fully_preserved with consistent visual and physical continuity throughout.", "enablePrompt": true, "images": ["072b1d50d5bf022850c6c69b7a87c6cf.jpg"], "imageStates": [true], "imageTags": [["outfit", "body", "turnaround"]], "enableImages": true, "audio": null, "audioTags": ["voice_timbre", "dialogue_sync"], "enableAudio": true, "video": null, "videoTags": ["acting", "facial_acting"], "enableVideo": true, "selected": true, "allowRandom": true, "alwaysOn": false}, {"id": "s_mev1lsnmt1onju2", "name": "Bob", "subjectType": "character", "prompt": "<Picture 1> defines <Subject 1>'s facial structure, eye landmarks, and skin tone, and exact garment design, fabric weave, and color scheme.\n<Subject 1> must remain fully_preserved with consistent visual and physical continuity throughout.", "enablePrompt": true, "images": ["a4c458cf4d646b849a1afc99a3c2a02f.jpg"], "imageStates": [true], "imageTags": [["face_id", "outfit"]], "enableImages": true, "audio": null, "audioTags": ["voice_timbre", "dialogue_sync"], "enableAudio": true, "video": null, "videoTags": ["acting", "facial_acting"], "enableVideo": true, "selected": true, "allowRandom": true, "alwaysOn": false}], "objects": [{"id": "s_obfjbz1mt1pfkra", "name": "Car", "subjectType": "object", "prompt": "<Picture 1> establishes <Subject 1> (Car)'s overall 3D geometric shape, proportions, and silhouette, and surface material texture, reflectivity, color, and finish.\n<Subject 1> (Car) must remain fully_preserved with consistent visual and physical continuity throughout.", "enablePrompt": true, "images": ["16faae43e54a63e81bf59abfc371beb6.jpg"], "imageStates": [true], "imageTags": [["form_3d", "texture_wear"]], "enableImages": true, "audio": null, "audioTags": ["foley"], "enableAudio": true, "video": null, "videoTags": ["handling"], "enableVideo": true, "selected": true, "allowRandom": true, "alwaysOn": false}], "scenes": [{"id": "s_iqs0q4rmt1pbniz", "name": "Village", "subjectType": "scene", "prompt": "<Picture 1> establishes <Subject 1> (Village)'s architectural layout and spatial composition, and atmospheric lighting direction, volumetric contrast, and color mood.\n<Subject 1> (Village) must remain fully_preserved with consistent visual and physical continuity throughout.", "enablePrompt": true, "images": ["419814f8725b4355195a48e69c667f60.jpg"], "imageStates": [true], "imageTags": [["layout", "lighting"]], "enableImages": true, "audio": null, "audioTags": ["room_tone", "ambient"], "enableAudio": true, "video": null, "videoTags": ["camera_path", "env_dynamics"], "enableVideo": true, "selected": true, "allowRandom": true, "alwaysOn": false}]}, "viewMode": "grid", "previewMode": "names"} | β |
| seed | INT | 00β18446744073709550000 | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| subject_data | SUBJECT_DATA | β |