SkinToken Rig
Auto-skeleton and skinning inside ComfyUI
- trimesh
- trimesh
- rigged_path
- asset
- backend
This is the node the pack is named for, and it's doing something genuinely annoying for you. Feed it a character mesh as a TRIMESH and it predicts a full skeleton - joint positions, bone hierarchy, lengths - plus per-vertex skinning weights, then exports a rigged GLB or FBX you can drop straight into Blender, Unity, or Unreal. No manual bone placement. No weight painting. That's the whole pitch, and it mostly delivers.
If you've been generating 3D in ComfyUI - TRELLIS, Tripo, HY3D - you know the pipeline stops at geometry. You get a pretty static mesh and no way to animate it. Historically the answer was "export to Blender, fight Mixamo, fix the weights by hand." This node is the in-graph version of that step. The model underneath is SkinTokens by VAST-AI, the successor to UniRig, and it's the real deal: a GRPO-trained autoregressive transformer on a Qwen3-0.6B backbone that predicts skeleton and skinning as a single token sequence, with an FSQ-CVAE (the last.ckpt VAE) handling the discrete skin tokens.
How it actually works
The vendored model reads your mesh's vertices, faces, and normals, runs the prediction, then hands the result to Blender to build the armature, assign vertex groups, and export. Blender is non-negotiable: it's either imported as bpy in your ComfyUI env (rare) or, far more commonly, run headless as a subprocess via the pack's bridge script. Python 3.12 environments always take the headless path, and most ComfyUI installs can't import bpy anyway. Headless still needs a real Blender binary - more on that below.
First run also downloads both checkpoints (~1.6 GB) into ComfyUI/models/skintoken/, so budget one slow pass before anything fast happens.
The inputs that matter
- trimesh (required) - your mesh. A clean, closed character mesh in a T-pose gets noticeably better results than arbitrary geometry.
- skeleton_template -
Keep model names,Mixamo, orUnreal Engine 5. Renames bones so you can retarget directly. UE5 is the move for Mannequin retargeting. - file_format (
glb/fbx) plus save_file and filename_prefix - where the export lands (3D/SkinToken_under your output dir by default). - use_transfer - rig the original high-detail mesh instead of the (simplified) generated one. Turn this on for detailed characters; the README's own tip says results get better.
- bottom_center_origin - pivots the skeleton at the character's feet. Recommended for game engines.
- group_per_vertex (default 4) - max bone influences per vertex. Higher = smoother deformation, slower.
- The sampling stack (top_k, top_p, temperature, num_beams, repetition_penalty) - lower temperature and more beams give more deterministic skeletons. Leave them alone until something looks wrong.
Outputs: trimesh (the rigged mesh, for further nodes), rigged_path (the exported file's path), asset (an internal SKINTOKEN_ASSET for chaining), and backend (a string telling you whether it used bpy or blender_headless).
Install and the two walls you'll hit
Install via ComfyUI Manager (search ComfyUI-SkinToken) or clone into custom_nodes and pip install -r requirements.txt. It's a heavy requirements list - transformers, diffusers, lightning, open3d, trimesh - and needs a CUDA GPU with ~4 GB VRAM.
The two things that actually bite beginners:
- "Blender binary was not found." The headless export needs Blender 4.0+ on your
PATH, or theSKINTOKEN_BLENDER_BINenv var pointing at the binary. Install Blender, set the env var, restart. This is the #1 reason first runs die. - It's CUDA-only. The model errors out hard on non-CUDA devices - no CPU fallback. If you're on Apple Silicon or an AMD-only box, this pack won't run for you.
Other notes: use_transfer needs the source mesh path internally, which the node sets itself, so it just works - but a mesh with no faces, or garbage geometry, raises a clear error. Expect output quality to track input quality; it's a young model and character-heavy meshes are its home turf. For quick game/animation prototypes this is the fastest auto-rig in the ComfyUI ecosystem right now, and it keeps the whole loop inside one graph. That's worth the setup friction.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| trimesh | TRIMESH | — | |
| ckpt_name | COMBO | experiments/articulation_xl_quantization_256_token_4/grpo_1400.ckpt | 1 options: experiments/articulation_xl_quantization_256_token_4/grpo_1400.ckpt |
| device | COMBO | auto | 2 options: auto, cuda |
| save_file | BOOLEAN | true | — |
| filename_prefix | STRING | 3D/SkinToken_ | — |
| file_format | COMBO | glb | 2 options: glb, fbx |
| use_transfer | BOOLEAN | false | — |
| use_postprocess | BOOLEAN | false | — |
| group_per_vertex | INT | 41–32 | — |
| bottom_center_origin | BOOLEAN | false | — |
| smooth_angle | FLOAT | 550–180 | — |
| skeleton_template | COMBO | Keep model names | 3 options: Keep model names, Mixamo, Unreal Engine 5 |
| top_k | INT | 51–200 | — |
| top_p | FLOAT | 0.950.1–1 | — |
| temperature | FLOAT | 1.00.1–2 | — |
| repetition_penalty | FLOAT | 2.00.5–3 | — |
| num_beams | INT | 101–20 | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| trimesh | TRIMESH | — |
| rigged_path | STRING | — |
| asset | SKINTOKEN_ASSET | — |
| backend | STRING | — |