Comparing SnapRef v2a with v1b Using a Single Character Reference on M1 Max
Contents

SnapRef is a reference weight and ComfyUI node package for Anima that extracts character visual features from a single reference image and injects them during generation steps.
About a week after publishing my previous article testing SnapRef v1b on M1 Max, the next release, v2a, arrived.
According to its README, quantitative benchmark numbers for v2a remain roughly on par with v1a, but visual alignment with references improved noticeably.
The repository comparison table only lists v1a and v2a, leaving out direct numbers against v1b.
In my previous test of v1b, using Kana’s full-body standing pose turned Base’s running scene into a rear view across all five seeds.
When providing multiple references, the upper-body blazer consistently won out, and on Apple Silicon (MPS), certain reference dimensions yielded completely black images.
I tested v2a with the exact same reference images, prompts, and seeds to see what changed.
Overview of SnapRef v2a
| Item | Details |
|---|---|
| Author | 0ppxnhximxr on Hugging Face, ArcAnima on GitHub |
| Released | November 8, 2026 |
| Weight File | snapref_v2a.safetensors (381,821,960 bytes) |
| Base Model | Anima base v1.0 |
| License | CircleStone Labs Non-Commercial License v1.2 |
| Download | Hugging Face (v2a), GitHub |
The file size is virtually identical to v1a’s 381,822,008 bytes (about 382 MB).
The underlying mechanism is unchanged: the reference image passes through the model once, caching key/value pairs across each block’s attention mechanism to feed into every step during generation.
See my previous article on v1b for architecture details.
The comparison table in the README reflects a fixed benchmark of 64 cases across 2 seeds. SigLIP and DINO evaluate visual feature similarity, while CCIP measures character identity consistency.
| Metric | v1a | v2a |
|---|---|---|
| Visual tag recall (higher is better) | 0.8722 | 0.8727 |
| Redundant visual tags (lower is better) | 0.1341 | 0.1401 |
| Head SigLIP similarity (higher is better) | 0.8989 | 0.8903 |
| Head DINO similarity (higher is better) | 0.7431 | 0.7407 |
| Head CCIP distance (lower is better) | 0.0684 | 0.0715 |
| Full-image CCIP distance (lower is better) | 0.0725 | 0.0757 |
Quantitatively, v2a only leads in visual tag recall, and only by a tiny margin.
However, the README notes that visual inspection shows significantly better reference following.
New sample workflows highlight using mode char to alter art styles via prompts and supplying multiple reference images with customized weights.
Recommended settings from the README are as follows:
| Setting | Value |
|---|---|
| Sampler | euler / simple |
cfg | 4.5 |
fidelity | 1.0 |
| Workflow | 832×1216, 28 steps, seed 20261029 |
Node Changes
v2a includes updated custom node code for ComfyUI.
Diffing it against the node script used with v1b reveals two main changes:
| Change | Details |
|---|---|
| Automatic 2.9B support | Automatically reassigns 28 blocks of weights to the 28 native blocks among Anima-2.9B’s 40 blocks, avoiding the 12 inserted blocks (indices 2, 5, 8, …, 36) |
| Cache keying | Identifies reference caches with dedicated IDs rather than Python’s id(model). Comments note this avoids collisions when reloaded models reuse object IDs |
When testing v1b, I wrote a custom script to reassign weight tensor keys for 2.9B.
With v2a’s node, that step is no longer required.
However, the .double() call in the APG correction that crashes on MPS, along with the -inf mask handling behind black output, remain unmodified.
Test Environment
Anima Base (anima-base-v1.0) is the standard full model running at around 30 steps, while Turbo (anima-turbo-v1.1) is a lightweight distilled model running at 8 steps. I tested SnapRef across both.
| Item | Details |
|---|---|
| Hardware | MacBook Pro M1 Max 64GB (MPS) |
| UI | ComfyUI v0.33.3 (--bf16-vae --bf16-unet) |
| SnapRef | Node and weights from Hugging Face commit 2ca5eca (sha256 verified) |
| Reference Image | Full-body standing illustration of Kana (832×1216); added upper-body crop for multi-reference tests |
| Output Resolution | 896×1152 (matching v1b tests); 832×1216 for official settings section |
| Base | anima-base-v1.0, 30 steps, cfg 4.5, euler / simple |
| Turbo | anima-turbo-v1.1, 8 steps, cfg 1.0, euler / simple |
| Seeds | 20261027 (expanded to 20261028–20261031 for seed comparisons) |
| v1b Outputs | Sourced from previous article data |
As in the previous test, I changed two lines of .double() in the APG correction to .float().
All other custom node code remained as distributed.
I also verified whether the updated node altered v1b outputs.
Running v1b under the new node produced pixel-identical outputs for Turbo’s running scene (seed 20261027) and Base’s running scene (seed 20261030) compared to previous records.
Any differences observed between v1b and v2a stem from model weight changes, not node logic.
Running Default Official Settings
Matching the v1b article, I ran Base using the README prompt, workflow negative prompt, 832×1216 resolution, 28 steps, and cfg 4.5.
| Version | Time | Result |
|---|---|---|
| v2a | 280.7s | Sitting crossed-legged on a bench with cheek on hand, smiling under night streetlamps. Ahoge, scrunchie side-ponytail, white shirt, red necktie, black tights, and loafers intact |
| v1b (previous) | 289.9s | Nearly identical composition, neutral facial expression |


Prompt
masterpiece, best quality, score_7, safe, 1girl, solo, full body, sitting, crossed legs, bench, street, night
Negative:
worst quality, low quality, score_1, score_2, score_3, artist name, blurry, jpeg artifacts, chromatic aberration
Base Running Pose
In my previous v1b tests, Base’s running scene stood out most.
v1b yielded a rear view across all five seeds, which matched unreferenced Base outputs and suggested a baseline bias in the model for that prompt.
I generated the same five seeds with v2a.
| Seed | v2a | v1b (previous) | Unreferenced (previous) |
|---|---|---|---|
| 20261027 | Front view | Rear view | — |
| 20261028 | Front view, smaller subject | Rear view, smaller subject | — |
| 20261029 | Front view | Rear view | — |
| 20261030 | Front view | Rear view | Rear view |
| 20261031 | Oblique rear view, turning back with open mouth | Rear view | Rear view |








v2a produced front views on 4 out of 5 seeds, with the remaining seed facing the viewer while turning back.
Across all five outputs, the side-ponytail, white shirt, red necktie, and black tights adhered to the reference.
While v1b resisted adopting the reference image’s forward orientation and preserved Base’s native rear-view composition, v2a pulled strongly toward the reference pose. This orientation-pulling behavior is closer to alternative adapters like Ref Adapter v2 and Role-Ref-KV tested in my previous benchmarks.
Prompt
masterpiece, best quality, score_7, newest, highres, absurdres, safe, 1girl, solo, full body, running, wind, hair blowing, dynamic pose, fantasy landscape, castle in background, sunset sky, dramatic clouds, grass field
Negative:
worst quality, low quality, score_1, score_2, score_3, blurry, jpeg artifacts, chromatic aberration, bad anatomy, bad hands, extra arms, extra fingers, missing fingers, text, watermark, signature, artist name, multiple views, split screen, comic, 2koma, 4koma
Turbo v1.1 Running Pose
I tested the same five seeds with Turbo v1.1.
| Seed | v2a | v1b (previous) |
|---|---|---|
| 20261027 | Preserved | Preserved |
| 20261028 | Black tights changed to thigh-high socks with bare thighs | Preserved |
| 20261029 | Changed to black leggings, bare knees, and high socks | Preserved |
| 20261030 | Preserved | — |
| 20261031 | Preserved | — |








In 2 out of 5 seeds with v2a, the black tights shifted into alternative legwear.
Upper-body attributes—hair, shirt, and tie—remained accurate across all five outputs.
The seeds displaying outfit alterations matched those that drifted in v1a during my earlier benchmarks: v1a produced over-the-knee socks on seed 20261028 and high socks on 20261029.
Given that file sizes are nearly identical, v2a may share architectural similarities with v1a, though the documentation does not elaborate on this.
Additionally, seed 20261027 generated an unprompted chest pocket.
Cake and Lying Down Scenes
| Condition | Time | v2a | v1b (previous) |
|---|---|---|---|
| Turbo Cake | 48.3s | Fork at mouth, necktie visible | Hand at mouth, necktie hidden behind arm |
| Base Cake | 290.9s | Fork at mouth, no cup | Nearly identical composition, cup present |
| Turbo Lying Down | 47.4s | Inverted (head at bottom), knees raised, feet out of frame | Head at top, crossed legs, loafers visible |
| Base Lying Down | 290.9s | Nearly identical composition to Turbo, white flowers | Head at top, knees raised, loafers visible, yellow and white flowers |








The cake scene produced framing very close to v1b.
In the lying down scene, v2a positioned the head toward the bottom of the canvas in an inverted framing across both Turbo and Base.
All four outputs preserved the ahoge, side-ponytail, necktie, and black tights.
Prompts
Cake scene:
masterpiece, best quality, score_7, newest, highres, absurdres, safe, 1girl, solo, upper body, sitting, eating, cake, cafe, indoors
Lying down scene:
masterpiece, best quality, score_7, newest, highres, absurdres, safe, 1girl, solo, full body, lying on back, on grass, from above, looking at viewer, flowers, daytime
Changing Style with mode char
SnapRef provides two primary mode options: cs (Character & Style, default), which retains both character features and overall artistic rendering, and char, which isolates character features to allow style tags in the prompt to take precedence.
The README illustrates mode char shifting outputs into watercolor or 1990s anime aesthetics.
In v1b, setting char failed to induce watercolor textures and instead tinted the hair.
Using identical tags, I tested Base and Turbo on the cake scene.
| Model / Tag | cs | char |
|---|---|---|
| Base (no tag) | Default cake scene | Slightly deeper hair shading, otherwise identical |
Base watercolor (medium) | Unchanged | No watercolor texture; hair shifted to bright orange, shirt picked up blue tints, background elements became flatly yellowed |
Base 1990s (style), retro artstyle | Unchanged | Hair shifted toward darker orange; line work and shading did not clearly reflect vintage animation |
Turbo watercolor (medium) | Standard rendering | Hair shifted slightly orange with enhanced gloss |








With Kana’s reference image, v2a’s char mode continued the same tendency seen in v1b, altering hair color before art style.
Using Both Bust and Full-Body References
Matching the v1b test, I combined an upper-body image wearing a blazer and ribbon with the full-body standing pose wearing a white shirt and necktie.
Because the two inputs feature different outfits, it is straightforward to identify which reference informs each part of the character.
I tested Turbo v1.1’s running scene with multi_layout set to separate.


| Condition | Time | v2a | v1b (previous) |
|---|---|---|---|
| Bust only | 51.5s | Blazer and ribbon. Plaid skirt, bare legs, single high sock | Blazer and ribbon. Plaid skirt, bare legs, single high sock |
| Bust + Full, equal weight | 66.5s | White shirt and necktie. Plain skirt, black tights, loafers | Blazer and ribbon. Plain skirt, black tights, loafers |
| Bust weight 0.4 | 53.3s | White shirt and necktie | White shirt and necktie |
| Full-body weight 0.4 | 53.3s | Blazer and ribbon. Plain skirt, black tights, loafers | Not evaluated for running scene |







Under equal weighting, v1b prioritized the blazer from the bust image, whereas v2a favored the white shirt from the full-body illustration.
Lowering full-body weight to 0.4 in v2a switched the upper outfit to the blazer, while retaining the plain skirt and black tights from the full-body reference on the lower body.
Weight values enable selecting which outfit dominates across both versions, though the default priority inverted.
Running on 2.9B Without Key Reassignment
Because the v2a node automatically maps 28 weight blocks onto Anima-2.9B’s 40-block layout, I tested snapref_v2a.safetensors on Anima-2.9B-preview-v1 without modifying tensor keys.
| Condition | Time (Run / Cake) | Running Scene | Cake Scene |
|---|---|---|---|
| v2a, stock weights | 427.1s / 412.0s | Front view running, reference intact | Fork at mouth, reference intact |
| v1b, stock weights (previous) | 435.1s / 434.3s | Frozen in standing reference pose, blurred background with white halo | Frozen in standing pose, cup and cake floating translucently |




While stock weights failed on 2.9B in my v1b benchmarks, v2a functioned straight out of the box.
Because layer reassignment is handled inside the custom node, the updated node should theoretically handle v1b weights similarly.
Side-by-Side Reference Black Image on MPS
In my v1b benchmarks, providing a side-by-side two-character image at 1664×1216 (downscaled to 1184×864 internally) produced a solid black image on MPS when strength was non-zero.
Using the same image with strength 1 on Turbo v1.1 at 1216×832 produced completely black output under v2a as well (50.3 seconds).
As diffs confirmed, the -inf masking logic suspected of triggering zeroed Metal tensors remains untouched in the v2a node.
Adjusting reference resolutions so that total tokens align with multiples of 16 remains the necessary workaround.
Generation Speed Measurements
I measured generation times across Turbo v1.1 and Base running scenes.
| Condition | Turbo s20261030 | Turbo s20261031 | Base s20261030 |
|---|---|---|---|
| Unreferenced | 38.2s | 38.4s | — |
| SnapRef v1b | 51.4s | 51.5s | 312.0s |
| SnapRef v2a | 54.6秒 | 49.6s | 290.9s |
On Base, v2a running scene outputs took 289.9–295.9 seconds across five seeds, and fell within 280.7–297.9 seconds across all tested prompts.
This slight speedup over v1b aligns with the smaller weight size observed previously with v1a.
On Turbo, the time difference between v1b and v2a remained within normal per-seed variance.
Using Anima-Generated Images as References
The outfit instability observed on Turbo v1.1 affected legwear, and the reference was a hand-drawn illustration.
Using an image generated natively by Anima provides line work and coloring closer to the model’s training distribution, which might improve reference retention.
I tested two approaches: redrawing Kana’s standing pose with Anima to use as a clean reference, and using a generated running scene to request alternative viewing angles. Settings were Turbo v1.1, 8 steps, and cfg 1.0.
Using a Redrawn Standing Pose as Reference
Using the hand-drawn illustration as input, I generated white-background standing poses across four seeds.
masterpiece, best quality, score_7, newest, highres, absurdres, safe, 1girl, solo, full body, standing, looking at viewer, arms at sides, white background, simple background
All four outputs reproduced the hairstyle, scrunchie, shirt, tie, skirt, black tights, and loafers.
I selected seed 20261027 (832×1216), which avoided generating an unwanted chest pocket, to serve as the new reference.



Using this redrawn reference, I regenerated running scenes across the seeds that previously showed legwear alterations.
| Seed | Hand-drawn Reference | Redrawn Reference |
|---|---|---|
| 20261027 | Preserved | Preserved |
| 20261028 | Changed to thigh-high socks | Black tights preserved |
| 20261029 | Changed to leggings and high socks | One knee sheer, high sock below knee |






Seed 20261028 recovered full black tights, while 20261029 saw less pronounced distortion. Framing and upper-body details remained almost identical to hand-drawn tests.
The lying down scene on Turbo still placed the head at the bottom of the canvas, and Base’s running scene (seed 20261027) remained front-facing.


Changing Angles Using a Generated Running Scene
Using Turbo v1.1’s running output (seed 20261027) as the reference, I added from side or from behind to the running prompt.
| Condition | Running Scene Reference | Hand-drawn Reference |
|---|---|---|
from side s20261027 | Profile view, black tights preserved | Profile view, black tights preserved |
from side s20261028 | Profile view, black tights preserved | Profile view, black tights preserved, hand at forehead |
from behind s20261027 | Oblique rear view, turning back to show face | Pure rear view, black tights preserved |
from behind s20261028 | Pure rear view, black tights preserved | Pure rear view, changed to thigh-high socks |








Side profiles generated cleanly across both references.
The only condition showing legwear drift was the hand-drawn reference under rear view on seed 20261028.
Using the generated running image preserved black tights across all four outputs, though from behind on seed 20261027 turned into an oblique angle facing back rather than a direct rear view.
Choosing Between Versions
| Use Case | Recommended Option |
|---|---|
| Need front views on Base without explicit orientation tags | v2a (front view produced on 4 out of 5 seeds) |
| Want Base to avoid pulling toward reference orientation | v1b (preserves native rear orientation on running scenes) |
| Need strict lower-body consistency on Turbo | v1b (v2a shifted legwear on some seeds) |
| Minimize legwear drift on v2a | Use a redrawn standing pose generated by Anima as the reference |
| Keep the same outfit across side and rear views | Use a generated scene as reference with from side or from behind |
| Prioritize upper outfit from bust reference in multi-reference setups | v2a with full-body reference weight reduced to around 0.4 |
| Target Anima-2.9B | v2a custom node (automatically maps weights without manual key conversion) |
| Smaller storage footprint | v2a (382 MB, roughly 40% the size of v1b’s BF16 weights) |