The Problem
Character rigging in ComfyUI has historically meant either sending meshes to external tools like Blender or Mixamo, or using rigid, single-purpose auto-riggers. UniRig (SIGGRAPH 2025) and Make it Animatable (CVPR 2025) both solve automatic skeleton extraction and skinning, but neither ships as a ComfyUI node. This wrapper puts those research models behind ComfyUI nodes so artists can rig, skin, pose, and export characters without leaving the graph.
What This Does
ComfyUI-UniRig wraps two model families: nodes/mia/ (Make it Animatable) for humanoid characters, and nodes/unirig/ for general skeletons. The nodes/animation.py, nodes/skinning.py, and nodes/auto_rig.py files expose the core node logic. The repo bundles Blender (nodes/unirig/direct_export_fbx.py uses bpy for FBX export) and downloads model weights on demand via nodes/unirig/download.py. Six example workflows under workflows/ show humanoid rigging, bird rigging, and animation application.
How It Is Wired
Execution starts at execute in nodes/animation.py:116, which routes through 118 functions. That function calls _mm (15 call sites) and exists (20 call sites) — these two utility functions are the widest blast radius in the codebase; changing them breaks the most callers. The nodes/mia/utils.py file carries the heaviest load: 71 functions and 5 classes, including _mm, _standardize_quaternion, and _quaternion_to_matrix. nodes/mia/models_ae.py provides exists, default, and cache_fn, used across 8 files.
The module graph shows nodes/base and nodes/unirig/__init__ as pure sinks (instability 0) — safe to change. nodes/load_model sits at 0.6 instability, caught between callers and model loading. No circular dependencies exist across 46 modules, so refactoring is not blocked by cycles.
A full run touches the filesystem via models_dir.mkdir in download, and nodes/unirig/direct_export_fbx.py reads/writes files and a database. Inference happens in nodes/mia/model.py and nodes/unirig/direct.py. The shortest path from entry to external effect is execute -> download, two hops.
How To Use It
Setup (from README):
cd ComfyUI/custom_nodes
git clone https://github.com/PozzettiAndrea/ComfyUI-UniRig.git
cd ComfyUI-UniRig
pip install -r requirements.txt --upgrade
python install.py
The README warns install.py uses the experimental comfy-env package and pixi. Configuration: model weights download on first use; no API keys. YAML configs under nodes/unirig/configs/model/ and nodes/unirig/configs/skeleton/ define model and skeleton specs. Running: load one of the six JSON workflows from workflows/ in ComfyUI and run the graph.
Real-World Use
A character artist receives a static mesh, drops it into the UniRigAutoRig node, gets a skinned character, then applies a Mixamo animation from assets/animation_templates/mixamo/ via UniRigApplyAnimation. The result exports through export_rigged_fbx with bundled Blender.
Code Health & Issues
Static analysis found 32 findings (11 high, 21 medium). The dominant issue is deep nesting (20 occurrences, max depth 8) in nodes/load_model.py, nodes/skeleton_extraction.py, and nodes/skinning.py. Duplicated code blocks appear 51 times across 16 files, notably nodes/animation.py and nodes/mia_auto_rig.py. Six files exceed reasonable size, led by nodes/mia/utils.py at 935 lines. Three files open files without context managers. nodes/unirig/direct_export_fbx.py catches broad exceptions.
SDLC gaps: CI exists but no workflow invokes the 4 test files. GitHub Actions are pinned to mutable tags (@v0.2.20), not commit SHAs. No lockfile, no Dependabot, no dependency scan. Two blobs exceed 5MB (realistic_male_character.glb at 19.7MB).
The Bottom Line
A functional wrapper for serious research code, with good workflow coverage and bundled Blender. The code quality issues are real but concentrated in utility files you likely won't touch. Use it if you need UniRig inside ComfyUI; harden CI before relying on it for production.