SkinTokens Loader
The loader that quietly drags a 14 GB rigging model into ComfyUI
- model
SkinTokens Loader is the least glamorous node in the SkinTokens-NoBlender pack, and that's the whole idea. It doesn't rig anything, it doesn't clean anything. It loads the VAST-AI SkinTokens auto-rigging model (~14 GB of weights) and hands it to the rest of the graph wrapped for ComfyUI's VRAM manager. You configure no paths, you set no flags. If you've spent an afternoon with ComfyUI-3D-Pack, the absence of a model path field here is the feature.
Every other node in this pack needs a SKINTOKENS_MODEL on the socket before it will do anything - most obviously SkinTokens Rig. This is the node that puts it there. One dropdown, one wire, done.
What it actually does
First run, it downloads the model from the VAST-AI/SkinTokens HuggingFace repo into your HF cache ($HF_HOME), then keeps it there so every later run is instant. The model is TokenRig - an autoregressive transformer (a Qwen3-0.6B backbone plus a shape encoder) that turns a static mesh into a skeleton plus skin weights. The "articulation (GRPO)" entry in the dropdown is the single checkpoint the repo ships right now (grpo_1400.ckpt); it's a dropdown rather than a hardcoded path because the author kept it a list so more checkpoints can be added later. Don't expect a menu of choices today.
The part that's easy to miss is how it's loaded. The model doesn't grab the GPU at startup and hold it - it loads onto ComfyUI's offload device (CPU) and is wrapped in a ModelPatcher, the same wrapper ComfyUI uses for checkpoints and UNets. When a downstream node actually needs it, ComfyUI's model manager moves the weights to the GPU on demand, and evicts them when another workflow wants the VRAM. So that 14 GB model doesn't squat on your card between runs. Rigging is one of those rare jobs where you can leave the node in a workflow and forget it's there until the queue hits it.
The inputs and output
There's exactly one input, model, a dropdown with the single "articulation (GRPO)" checkpoint. And exactly one output, also called model, of the custom SKINTOKENS_MODEL type. Wire it into the model socket of a SkinTokens Rig node. That's the whole surface area.
Install
Via ComfyUI Manager (search SkinTokens-NoBlender), or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/stevelittlefish/ComfyUI-SkinTokens-NoBlender
pip install -r ComfyUI-SkinTokens-NoBlender/requirements.txt
torch isn't pinned because ComfyUI provides it; flash-attn is optional and the code falls back to standard attention if it's missing. The ~14 GB of weights are not bundled and don't come down at install time - they download the first time this node runs.
Where people get burned
The first run looks like a hang. It isn't - 14 GB takes a while depending on your connection, and there's no progress bar beyond the HF download dots. Give it time or watch huggingface_hub activity before you kill it. If the download fails, check auth: if VAST ever gates the repo, you'll need huggingface-cli login or $HF_TOKEN set.
The other recurring confusion is a workflow running without this node in it - Rig's model socket turns red, and nothing explains why. Loader isn't a formality; Rig is useless without it. And because it's a real model load, don't expect it to run happily on a 4 GB card. The node is honest about that only when inference starts, not at ComfyUI startup - the package imports without a GPU so you won't get a warning until queue time.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| model | COMBO | articulation (GRPO) | 1 options: articulation (GRPO) |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| model | SKINTOKENS_MODEL | — |