Routes ③ and ④ use VNCCS_QI2_PoseStudioV1.1.safetensors as a fixed name.
To use V2, users had to edit two scripts, and git pull then conflicts.
- run_pose_transfer.py and run_vnccs_ui.py read VNCCS_LORA.
- doctor.py checks the same file name.
- The default stays V1.1. Route ③'s --lora flag still takes precedence.
- Document the variable in install/setup.md and CHANGELOG.md.
Adds README.en.md (full translation, language switcher on both READMEs)
and a CHANGELOG covering everything since v1.0.0. validate_package.py now
checks both READMEs' embedded images instead of only the Chinese one.
Co-Authored-By: Claude Code <noreply@anthropic.com>
doctor.py reconfigures stdout to UTF-8 (cp1252 consoles crash on the ①②③④ route glyphs); media_lock.py gains an atomic O_EXCL lock-file fallback for platforms without fcntl (default path now via tempfile); run_vnccs_ui.py normalises path checks with as_posix() so --list-poses works on Windows, plus UTF-8 stdout/stderr. POSIX behaviour verified unchanged. Contributed by @yi-john-huang.
README gets a dedicated macOS section (memory-based model choice,
community-reported speed numbers, MPS VAE workaround, route support),
explicitly labelled as community data since maintainers have no Mac
hardware. CI now also runs the offline package validation on
macos-latest to prove script-level compatibility.
Fill the route-③ slot with the capability verified 2026-10-16: dual-image
edit using a textureless 3D mannequin render as the pose source (image 1)
and the character as image 2, with the VNCCS PoseStudio LoRA @1.0 and the
'replace the pose of <image 2> with the pose of <image 1>' prompt
(25 steps / cfg 1 / euler+simple). Stable across seeds; without the LoRA
the mannequin is ignored. Photos/illustrations as pose references remain
unusable (composite or redraw the reference person) — retested twice.
New scripts/run_pose_transfer.py (end-to-end tested); README/setup/SKILL
updated: four routes listed, route ③ requires only the base models +
VNCCS LoRA and no browser; mannequin renders come from route ④ captures.
Add the standard Apache License 2.0 (Copyright 2026 Arekejoker) covering
the repository's original scripts, workflows, prompts and documentation.
Third-party materials (author sample images, community pose library,
models/LoRAs) stay with their original authors and are excluded via an
explicit carve-out in the README. validate_package.py now requires the
LICENSE file to exist; SKILL.md declares the license in its frontmatter.
Summarize minimum/recommended specs for running the int8 base
package locally: 12GB VRAM + 32GB RAM minimum, 24GB VRAM recommended,
GGUF guidance for 8GB cards. Numbers from our DGX Spark measurements
plus the model file sizes; link it from install/setup.md.
The curated pose shipped as '1' with no tags; rename it to a
descriptive name (Laying Back on Elbows) and add browse tags. Also
extend validate_package.py to reject empty README-referenced images,
matching the existing non-empty check for pose previews.
The five previews (Crawling rear, Feet Apart, Fetal rear, Fighting
Straight Punch, Squatting Leaning Back) were 0-byte files shipped in
the initial import. Regenerated in the library's art style (anime,
same character) and resized to the standard 768px-long-side webp.
validate_package.py now also rejects empty preview files.
Cursor tip now sits in the open space right of the CTA text instead of
hugging the text end. README img gets ?v=2 so GitHub's camo refetches the
updated GIF without another rename. validate_package now strips query
strings before checking README image paths.
GitHub's camo CDN cached the old chevron GIF under the same URL, so the
cursor animation never appeared in the rendered README. Renaming the file
forces a fresh fetch. The static PNG cover is no longer referenced.
- animated GIF (16f, 120ms): pulsing yellow CTA text + bouncing chevrons
- width=100% so the card spans the README column
- bold 'click the card' line under the image inside summary
Previous attempt used a plain-text summary which readers missed; the new
summary is a purpose-drawn 18+ warning card (no author pixels) that reads
as a click target at a glance. Expanded content unchanged (three originals,
files untouched).
Every check only inspects package files or GETs the local ComfyUI API;
independent guards degrade failures to WARN/SKIP with a fix hint (setup.md
section) instead of crashing. Exit non-zero only on FAIL (missing package
files, unreachable ComfyUI). Verified: 11/11 OK on the production box, and
graceful SKIPs with an unreachable ComfyUI from a different cwd, plus --json
output. Referenced from README quick start, setup.md checklist and SKILL.md.
- scripts/browser_fallback.py: standalone CDP adapter used when the OpenClaw
browser client is absent (reuse COMFY_BROWSER_CDP or launch a throwaway
headless Chromium); wired into run_vnccs_ui.py and make_custom_pose.py
- run_vnccs_ui.py: VNCCS_POSELIB/COMFYUI_INPUT/COMFYUI_OUTPUT default from
$COMFY (or ~/ComfyUI); --prompt injects the scene prompt into
pose.prompt/pose_prompts/export.user_prompt before the graph loads
- docs updated (setup.md, SKILL.md, README.md)
Loads a library pose into the PoseStudio editor, applies bone rotations, and saves through the editor's own saveToLibrary(), so the result matches the Save dialog (pose JSON + preview under local_user_poses/poses/<category>/).
loadFromLibrary() needs the /vnccs/pose_library/list entry; passing the pose file content fails silently because it has no name.
- Edit LoRA moved to RunningHubAI/rh-qwen-image-2.1-aio-nsfw-lora under a new file name.
- VNCCS LoRA is at the repository root, not under LoRAs/.
- Pose library refresh is now POST /vnccs/pose_library/repositories/refresh, and /list returns {"poses": [...]}.
- Document the 3 VNCCS node dependencies missing from a standard ComfyUI env.
- Note --no-sandbox for Chromium on AppArmor-restricted Ubuntu.
The output loop labelled any file whose name contained "pose" as the doll image. Full pose keys such as local_user_poses/... contain "pose", so the result was saved as doll_<pose>.png. find_new_outputs only returns files with the result prefix, so save every match as result_<pose>.png.