TS Save Pose Data
Run pose detection once, reuse the result forever
- pose_data
- saved_path
Pose detection is the hidden tax on pose-driven video: every generation run re-detects the same clip, because the detector result only lives inside the graph. TS Save Pose Data is the counter - it caches a POSEDATA sequence to disk so you can iterate on smoothing and generation settings without ever re-running OpenPose/ViTPose. Run detection once, save, and from then on your workflow loads the cached pose in a fraction of a second.
It pairs with TS Load Pose Data in the same pack, and it's the kind of utility that quietly saves you hours. Detection is the slow, expensive part of a pose workflow; generation is the part you actually want to tune. Saving the result decouples the two.
How it works
Feed it a pose_data and it writes a compressed .npz archive to ComfyUI's output folder - the same structure the Aligned-AI / Kijai-style pose nodes produce, including the per-frame confidence arrays and the original pre-smoothing data if present. Everything is plain numpy arrays and strings, so the file is portable between machines and carries no code references.
Now about the name - TSSavePoseDataAsPickle. It's a lie, in the good way. Older releases genuinely wrote Python pickles, and pickle is an arbitrary-code-execution format: a pose file shared by anyone else was untrusted input running with your permissions. Those pickles also embedded the absolute install path of ComfyUI-WanAnimatePreprocess as a module name, so they broke whenever that pack moved. The class name is kept so old saved workflows still resolve, but the node writes safe .npz now. If you have old .pkl caches, they can't be loaded anymore - re-save them through this node (the README links a converter for the one-off migration).
The inputs that matter
- pose_data (POSEDATA) - wire from your pose detector, or from
TS Pose Data Smootherto stash the smoothed version for later comparison. - filename (STRING) - optional. Empty gives you an auto name like
pose_data_20260826_143500.npz. It never overwrites: if the name exists, it appends_0001,_0002, and so on. Type.pklor.pickleout of habit and it'll quietly correct the extension to.npz.
Output: saved_path (STRING) - the full path where the file landed, if you want to hand it elsewhere.
Install
Part of Teskor's Utils. ComfyUI Manager → search Teskor's Utils → Install → Restart. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/teskor-hub/comfyui-teskors-utils
pip install -r comfyui-teskors-utils/requirements.txt
Restart, find it under TS Utils/Pose. Just numpy and opencv-python; nothing heavy.
Gotchas
The folder split is the one thing that trips people up. This node saves into ComfyUI's output folder, but TS Load Pose Data reads from the input folder - so the round-trip isn't automatic. Save your pose, then drop the .npz into the input folder (where you keep reference images) and the load node's dropdown will find it. And worth repeating: it's a cache, not a backup format with a versioned contract - if you rely on saved poses across pack updates, re-save them after upgrading. Cheap to do, and it costs you one detection run instead of a silent format mismatch later.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| pose_data | POSEDATA | — | |
| filename | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| saved_path | STRING | — |