Tessela-M21-Gallery-Pecs

On view now โ€” Tessela is on display at M21 Gallery, Pรฉcs, Hungary through 23 August 2026, running unattended throughout opening hours. For those who haven’t yet stood in front of it, or want to know what lies behind it, here is the piece’s story.

Perceptual Spaces โ€“ Hommage ร  Vasarely by Light

Group exhibition by the Lighthouse Association and guest artists organized by the Lighthouse Association”. – For the 120th anniversary of the birth of Victor Vasarely.

Scene 1 โ€” Difference: a chromatic-aberration reading of the Vega grid. Still from the real-time rendering.
Scene 1 โ€” Difference: a chromatic-aberration reading of the Vega grid. Still from the real-time rendering.

THE PROGRAM

The starting point of Tessela is the program of Vasarely’s ล“uvre, as the title of the 1965 exhibition The Responsive Eye fixes it: the image does not depict โ€” it operates; the terrain of the work is not the canvas but the viewer’s perception. The bulging grids of the Vega series do not depict a sphere; the sphere comes into being in the viewer’s perception. With this program Vasarely anticipated, by decades, what we now call immersive or interactive media art.

Contemporary new media frequently invokes this legacy, typically at the level of visual motifs; the original perceptual question โ€” what does the eye see, and what does the brain construct โ€” is less often at the centre of the works. Tessela returns to this program, and continues where the painter’s toolkit came to its end.

GEOMETRY, PRESENCE, LIVE IMAGE

The first layer of the continuation is geometry. Vasarely achieved the bulge of the Vega grids through perspectival distortion, as a painterly illusion. The grid of Tessela curves according to the Poincarรฉ disk model of hyperbolic geometry: the cells grow denser towards the edges because of the real curvature of the space โ€” the distortion follows from the structure of the space, not from an effect applied to its surface. This step has a scholarly precedent: in 2010 the mathematician Douglas Dunham published a hyperbolic reinterpretation of Vasarely’s patterns (Hyperbolic Vasarely Patterns) โ€” at the Bridges conference, held that year precisely in Pรฉcs. Tessela runs this mathematics live, and connects three levels in a single work: Vasarely’s Euclidean illusion, Dunham’s hyperbolic geometry, and the real, physical space of the viewer.

The second layer is the presence of the viewer. An infrared camera watches the space in front of the projection; there is no touch, no deliberate gesture โ€” the viewer’s mere bodily presence shapes the image. Approaching, the grid flattens and magnifies; stepping back, it regains its curvature; when no one is present, the image settles into a slow, autonomous drift. What the program of the Responsive Eye entrusted to the beholder is here measured and answered by the work itself: the viewer literally stands inside the active structure. The legacy is thus continued not by reproducing the pattern, but by rebuilding the relationship between viewer and image.

The third layer is time. Five scenes, each of roughly two minutes, follow one another in a continuous cycle; all derive from the same mathematical core, and together they trace the path from the bulge of the Vega plane to reverse-perspective spaces opening into depth. The image is regenerated at every moment, sixty times a second โ€” not a video that repeats, but a system that is happening.

CONTEXT

Ivรณ Kovรกcs has been designing architectural projections and immersive spaces for two decades. Tessela is a piece of research distilled from this practice, reduced to a single projected image: every element of it is about perception, not spectacle. Constructivist reduction โ€” few elements, precise relations โ€” is a method here, not a stylistic device: the same tradition that Vasarely absorbed at the Mลฑhely academy in Budapest, in the circle of the Hungarian Bauhaus.

The work is presented in Pรฉcs, Vasarely’s birthplace, in the year of the 120th anniversary โ€” in the city where Dunham’s paper was delivered in 2010. The origin in Pรฉcs, the international legacy of Op Art and contemporary generative art thus converge in a single installation.

The execution is deliberately modest: one projector, a palm-sized computer, an infrared camera; the system runs unattended for the entire duration of the exhibition. The emphasis is not on the apparatus, but on what happens between the viewer and the image.

DOCUMENTATION

Essay and mathematical notes

tessela.ivo3d.com/#/essay โ€” the Math and Code chapter can be selected at the top of the page

Interactive scenes (run in the browser โ€” explore with the mouse, or control them with the laptop camera)

Scene 1 Scene 2 Scene 3 Scene 4 Scene 5

Videos (YouTube Shorts)

Hommage ร  Vasarely โ€” Vega-series 1v. Hommage ร  Vasarely โ€” Vega-series 2v.

Hommage ร  Vasarely โ€” Vonal-Fegn 3v. Hommage ร  Vasarely โ€” Quasar-Dia 4v.

Hommage ร  Vasarely โ€” Dess-version 5v.

Ivรณ Kovรกcs

ยท ivo3d.com
ยท 2026


LIQUID HORIZONS โ€” Ivรณ Kovรกcs | 360ยฐ Immersive Video Installation

LIQUID HORIZONS โ€” an immersive video installation (at Fixir Gallery, Veszprem)
by Ivรณ Kovรกcs, reconstructed as a fully navigable 360ยฐ space.

In its physical form, the work encloses the visitor in a 4.2 ร— 4.2 m room of four seamless projected walls โ€” a single, uninterrupted synthetic space with no doors, no paths, no horizon to hold on to. The viewer’s own body becomes the only fixed point of reference.

Six scenes unfold without narrative โ€” glitch corridor, brutalist labyrinth, biological vein networks, geometric core, spectral veils, liquid-architecture, synthetic horizons โ€” juxtaposing Trauma-Arbeit and utopia in a digital realm, somewhere between architectural critique and algorithmic aesthetics.

This 360ยฐ version was rebuilt in TouchDesigner and rendered in 8K from the exact center of the room โ€” on the one spot where visitor could stand.

๐ŸŽง Use headphones. ๐Ÿ“ฑ Drag the screen or move your phone to look around. ๐Ÿฅฝ Best experienced in a VR headset in 8K.

Video: Ivรณ Kovรกcs
Music: Jรณzsef Iszlai
Year: 2026 | Duration: 17:16
Made with: Notch, Stable Diffusion, 3D simulation, TouchDesigner
More: https://3dvideomapping.net/art/installation-art/2026-liquid-horizons/ | https://liquid.ivo3d.com

#360video #VR #videoart #8K #immersive #newmediaart #videoinstallation #ivo3d #generativeart #digitalart #audiovisual #syntheticspaces #liquidhorizons #immersiveart #mediaart #fixir
#comfyui

Seamless video style transfer

A ComfyUI workflow that re-skins a photographed image sequence into a completely different material world, while keeping the original architecture, perspective and camera motion intact.

Built for a 4-wall projection piece: the output tiles seamlessly on the X axis, so the left and right edges of every frame match up when the image is wrapped around a room.

This workflow produced one of the scenes in Liquid Horizons (2026), a 360ยฐ looped panoramic projection in a 4.2 ร— 4.2 m enclosed room, exhibited at F|X|R Mรฉdialabor, Veszprรฉm. Released as-is, with the settings that were actually used.

(Magyar leรญrรกs: GitHub โ†’ README.hu.md)

Source frame โ€” abandoned brutalist stairwell, itself an AI render (3840ร—2160)
Source frame โ€” abandoned brutalist stairwell, itself an AI render (3840ร—2160)
Style reference โ€” bio-organic membrane with oxygen bubbles
Style reference โ€” bio-organic membrane with oxygen bubbles
Output โ€” the stairwell re-skinned as organic tissue (3072ร—1728)
Output โ€” the stairwell re-skinned as organic tissue (3072ร—1728)

The stairwell’s arches, openings and depth layering survive the transfer โ€” they just become tissue instead of concrete.


1. What this actually does

It is not img2img with a high denoise and hope. Four independent systems constrain the render, and each one is there to solve a specific failure mode:

SystemNodesSolves
Structure lockMiDaS depth + LineArt โ†’ 2ร— ControlNetkeeps the real geometry so the AI can’t invent a new room
Style injectionIPAdapter (reference image) + text promptsupplies the material/palette that the prompt alone can’t describe
Temporal coherenceAnimateDiff (looped uniform context)stops the per-frame flicker you get from frame-by-frame img2img
Seamless tilingcircular padding on model + VAE, x_onlyleft/right edges match for wrap-around projection

Plus a sequenced batch loader so a 5000-frame shot can be rendered 64 frames at a time without running out of VRAM, and an image-sequence saver so the result stays as frames (no video encoding, no generation loss) for the edit.


2. Pipeline, in order

Workflow pipeline โ€” from sequence loading to image-sequence save

3. Why each block is in there

3.1 Sequenced loader (the part everyone gets wrong)

PrimitiveInt is set to increment. Its value goes through MathExpression: a * 64 into the loader’s skip_first_frames. frame_load_cap is 64.

So each time you press Queue, ComfyUI renders the next 64 frames:

Queue #PrimitiveIntskip_first_framesframes rendered
1000โ€“63
216464โ€“127
32128128โ€“191

Combined with Auto Queue this walks through an arbitrarily long sequence at constant VRAM.

Reset PrimitiveInt to 0 before starting a new sequence, otherwise you silently resume from wherever the last job stopped. If you change frame_load_cap, change the * 64 multiplier to match โ€” they must be identical or you skip or duplicate frames.

The loader also does the first downscale (1920ร—1080), and ImageScale takes it to the actual render resolution of 768ร—432. SD 1.5 is trained at 512ยฒ, so 768ร—432 is roughly the largest 16:9 frame you can push before geometry starts repeating; the upscaler recovers the resolution at the end.

3.2 Two ControlNets, deliberately unequal

ControlNetPreprocessorStrengthstart โ†’ endJob
control_v11f1p_sd15_depthMiDaS (bg_threshold 0.1, res 768)0.550.10 โ†’ 0.80volume, spatial layering, where things are in space
control_v11p_sd15_cannyLineArt (res 768)0.650.20 โ†’ 1.00edges: stair nosings, arch outlines, window openings

Two design decisions worth copying:

  • The canny ControlNet is fed LineArt, not Canny. Canny on a mossy, noisy concrete photo produces thousands of texture edges, and the model dutifully draws every one of them โ€” you get a traced photo. LineArt returns clean structural contours and ignores surface grain, which is exactly what you want when the surface is about to be replaced anyway.
  • Neither starts at 0.0. Depth kicks in at 10 %, lineart at 20 %. The first steps are left free so the model can commit to the material before structure is imposed. Start both at 0 and the output looks like painted concrete instead of tissue.
  • Depth ends at 0.80 so the last 20 % of sampling is unconstrained โ€” that is where the organic detail actually forms.

ScaledSoftControlNetWeights (0.825) feeds both loaders. It ramps ControlNet influence across the UNet blocks instead of applying it flat, which is the main defence against the “AI traced over my photo” look.

3.3 IPAdapter โ€” the actual style transfer

ip-adapter-plus_sd15 + CLIP-ViT-H-14, weight 0.8, ease in-out, end_at 0.8, embeds scaling V only.

The text prompt can describe what (fleshy tendons, Voronoi cells, turquoise veins) but it cannot pin down the exact palette, the sheen on the bubbles, or the specific way the membranes catch light. The reference image does that. Weight 0.8 is high โ€” this workflow is style-led, the prompt only steers.

ease in-out weights the reference more in the middle of sampling, less at the start and end, which keeps it from fighting the ControlNets early or muddying the fine detail late.

PrepImageForClipVision (LANCZOS, center crop, 0.01 sharpening) is not optional โ€” CLIP Vision wants 224ยฒ, and feeding it a raw 5504ร—3072 image without a proper centre crop throws away most of the reference.

3.4 Seamless X tiling for 4-wall projection

Three nodes work together:

  • Apply Circular Padding Model โ€” swaps the UNet’s convolutions to circular padding
  • Apply Circular Padding VAE โ€” same for the VAE, so the encode/decode doesn’t re-introduce a seam
  • CircularVAEDecode with x_only โ€” restricts the wrap to the horizontal axis

Horizontal only, because the image wraps around four walls but the floor and ceiling are not continuous. Enable Y as well and you get a visible smear where the ceiling tries to meet the floor.

Both padding nodes must be active โ€” patching only the model leaves a faint seam that the VAE reintroduces at decode, and it is very hard to spot until it is projected two metres wide.

3.5 Motion

  • ADE_AnimateDiffLoaderWithContext โ€” mm_sd_v15_v2.ckpt, beta schedule avg(sqrt_linear,linear), motion_scale 0.8
  • ADE_LoopedUniformContextOptions โ€” context length 16, stride 1, overlap 8, fuse flat
  • ADE_AnimateDiffLoRALoader โ€” v2_lora_ZoomIn.ckpt at 0.45

AnimateDiff here is not generating the motion โ€” the source footage already has a moving camera. Its job is temporal coherence: the 16-frame context window with 8 frames of overlap means every frame is denoised with knowledge of its neighbours, so the tissue textures stay attached to the same surfaces instead of boiling.

motion_scale 0.8 (below the default 1.0) deliberately damps AnimateDiff’s own motion so it doesn’t fight the camera move that is already in the plate.

The ZoomIn motion LoRA at 0.45 adds a slow inward push on top of the source camera move. It is subtle at that weight โ€” a drift, not a zoom. Set it to 0 if your source already moves enough.

3.6 Sampler settings

35 steps ยท cfg 8.5 ยท dpmpp_2m ยท karras ยท denoise 0.90

Note that the latent comes from VAEEncode of the source frames, not from an empty latent โ€” this is img2img. denoise 0.90 leaves 10 % of the original image in the mix, which is enough to anchor the lighting and contrast to the plate without letting the concrete show through.

cfg 8.5 is high for SD 1.5, but it is compensating for two ControlNets and an IPAdapter all pulling in different directions.

more_details LoRA at 0.6/0.6 is on the base model โ€” it is there because the render resolution (768ร—432) is low and the model needs help producing texture that survives a 4ร— upscale.

3.7 Output

Image Save (WAS Node Suite) writes a numbered JPG sequence at quality 100, 5-digit padding: styleTransfer_00001.jpg, styleTransfer_00002.jpg, โ€ฆ

Frames, not video, on purpose: – the batch loader produces the shot in chunks; a video node would produce a pile of clips to splice – no inter-frame compression before the edit – a failed chunk can be re-rendered and dropped in without touching the rest

4x-UltraSharp runs before the save, taking 768ร—432 to 3072ร—1728.


4. Requirements

Custom nodes

PackUsed for
ComfyUI-AnimateDiff-EvolvedADE_AnimateDiffLoaderWithContext, ADE_LoopedUniformContextOptions, ADE_AnimateDiffLoRALoader
ComfyUI-Advanced-ControlNetControlNetLoaderAdvanced, ScaledSoftControlNetWeights
ComfyUI_IPAdapter_plusIPAdapterAdvanced, IPAdapterModelLoader, PrepImageForClipVision
comfyui_controlnet_auxMiDaS-DepthMapPreprocessor, LineArtPreprocessor
ComfyUI-KJNodesLoadVideosFromFolder, ImageUpscaleWithModelBatched
comfyui-pytorch360convertApply Circular Padding Model, Apply Circular Padding VAE
ComfyUI-seamless-tilingCircularVAEDecode
WAS Node SuiteImage Save
ComfyUI-Custom-ScriptsMathExpression\|pysssss

Models

FolderFile
models/checkpoints/SD1.5/dreamshaper_8.safetensors
models/vae/vae-ft-mse-840000-ema-pruned.safetensors
models/controlnet/control_v11f1p_sd15_depth.pth
models/controlnet/control_v11p_sd15_canny.pth
models/animatediff_models/mm_sd_v15_v2.ckpt
models/animatediff_motion_lora/v2_lora_ZoomIn.ckpt
models/loras/more_details.safetensors
models/ipadapter/ip-adapter-plus_sd15.safetensors
models/clip_vision/CLIP-ViT-H-14-laion2B-s32B-b79K.safetensors
models/upscale_models/4x-UltraSharp.safetensors

The MiDaS preprocessor downloads its own weights on first run.

The checkpoint path in the workflow is SD1.5\dreamshaper_8.safetensors โ€” it expects a SD1.5 subfolder inside models/checkpoints/. Either create it or re-pick the checkpoint in the node.


5. Setup

ComfyUI/
โ”œโ”€โ”€ input/
โ”‚ โ”œโ”€โ”€ stairway_seq/ <- your source frames (jpg or png, numbered)
โ”‚ โ””โ”€โ”€ neuronWithBubbles_ref.jpeg <- the style reference
โ””โ”€โ”€ output/
โ””โ”€โ”€ styleTransfer/ <- created on first save

All paths in the workflow are relative to the ComfyUI root, so it loads and runs on any machine without editing. If your LoadVideosFromFolder build insists on an absolute path, replace input/stairway_seq with the full path โ€” that is the only node that may need it.


6. Running it

  1. Drop the source frames into ComfyUI/input/stairway_seq/.
  2. Load LCM_ip_ctrl_transfer.json.
  3. Set PrimitiveInt to 0.
  4. Queue once. Check the first 64 frames before committing to the whole shot.
  5. Happy with it? Turn on Auto Queue and let it walk the sequence.
  6. Reset PrimitiveInt to 0 before the next shot.

Do a lookdev pass first. Bypass the batch stepping, set frame_load_cap to 16, and iterate on prompt / IPAdapter weight / denoise until a 16-frame chunk looks right. A full shot at these settings is not something you want to discover was wrong at frame 3000.


7. What to tune

ParameterNodeValueEffect
denoiseKSampler0.90โ†“ keeps more of the original photo, โ†‘ more invention. Below ~0.75 the concrete starts showing.
weightIPAdapterAdvanced0.80how hard the reference image drives the look. 0.5โ€“0.6 lets the prompt lead instead.
strengthControlNet (depth)0.55โ†‘ locks volume harder, โ†“ lets the geometry melt
strengthControlNet (lineart)0.65โ†‘ preserves edges, โ†“ softens architecture into organic mass
start_percentboth ControlNets0.10 / 0.20โ†‘ gives the style more freedom early โ€” the single most effective knob
motion_scaleAnimateDiff0.80โ†‘ more independent motion, โ†“ follows the plate more closely
strengthZoomIn motion LoRA0.45the slow inward drift. 0 disables it.
context_length / overlapLoopedUniformContext16 / 8โ†‘ overlap = smoother but slower; 8/16 is the usual sweet spot
frame_load_cap + a * Nloader + MathExpression64chunk size โ€” must match each other

8. Prompt variations

Four Note nodes in the workflow carry the prompt variants that were tried. The active one is the oxygen bubble version; the others are kept because they change the result substantially:

  • base โ€” fleshy tendons, Zaha Hadid fluid architecture, Voronoi cellular pattern, metal datacables, turquoise veins, hazy blue void, dreamcore / Y2K surrealism
  • macro โ€” pushes toward close-up biological texture, subsurface scattering, matte non-glowing bio-hardware
  • oxygen bubbles (active) โ€” adds iridescent translucent bubbles trapped in the tissue, chromatic aberration, prismatic reflections

Recurring negatives: grainy, noise, grit, dots, dither, low-res textures (1.5) and glow, neon, vibrant lights (1.4). The anti-glow weight matters โ€” SD 1.5 will make anything described as “organic network” glow like a screensaver unless you actively suppress it.


9. Troubleshooting

SymptomCauseFix
Output looks like a traced photoControlNets too strong, or starting at 0.0raise start_percent, lower lineart strength
Textures boil / flicker between framesAnimateDiff context too short or overlap too smallraise overlap to 8+, check the motion model actually loaded
Visible vertical seam when wrappedonly one circular padding node activeboth Apply Circular Padding Model and VAE must be on
Frames skipped or duplicatedframe_load_cap โ‰  MathExpression multipliermake them identical
Second run starts mid-sequencePrimitiveInt not resetset it back to 0
Everything glows neonSD 1.5 default behaviour for organic promptskeep the anti-glow negative weights up
OOM64-frame chunks at 768ร—432 need real VRAMlower frame_load_cap and the multiplier together

10. License

  • Workflow and documentation โ€” MIT. Use it, change it, ship it commercially, no attribution required (though it is appreciated).
  • Example images (stairway_seq_000000.jpg, neuronWithBubbles_ref.jpeg, stairway_brained_out.jpg) โ€” CC BY 4.0. Share and adapt with credit.
  • Models, LoRAs and custom nodes referenced by the workflow are not covered by either โ€” each has its own terms. Check them before commercial use.

See LICENSE for the full text.


11. Notes

Built and rendered on ComfyUI 0.3.14 / frontend 0.6.0, RTX 4090. Roughly 20 GB VRAM at 64 frames ร— 768ร—432.

The workflow ships with embed_workflow enabled on the saver, so every output JPG carries the graph that produced it โ€” drag one into ComfyUI to get the exact settings back.

A Non-Destructive Object Compositing Workflow for ComfyUI

tunnel with the obsidian

A Non-Destructive Object Compositing Workflow for ComfyUI

Placing a cut-out into a background plate with FLUX.2 Klein, without re-rendering the frame.

I have released a ComfyUI workflow that performs a fairly ordinary Photoshop task: it
takes an object with an alpha channel, places it into a background plate, and makes it
look as though it had been photographed or rendered in that environment. The model is
given a narrow job โ€” compute the lighting, the reflected ambient colour and the contact
shadows โ€” and is prevented from touching anything else.

The repository is here, under an MIT licence:
https://github.com/tenpel/ComfyUI-PS-Composite

Why this still has a place

The obvious objection is that current image-editing models do this better. Nano Banana,
GPT-Image and comparable autoregressive systems are faster and produce more convincing
integration than a 9B distilled diffusion model working through a mask. That objection is
correct, and the workflow is not an attempt to refute it. It addresses a narrower set of
circumstances in which those systems are not available or not appropriate.

The first is that a conversational image editor re-renders the entire frame. Global tone,
grain, sharpness and colour shift slightly across the whole image, and the returned
resolution is whatever the service decides to provide. When the surrounding plate is
finished work that must not change, this is a real cost rather than a theoretical one.

The second is price. Output above roughly 2K is typically behind a paid tier, and
high-resolution work is precisely where the cost accumulates.

The third is confidentiality. Client plates, unreleased product renders and material under
non-disclosure cannot be uploaded to a third-party API, regardless of how good that API is.

The fourth is procedural. If the intention was always to mask the result back onto the
original afterwards, it is more economical to build the mask into the generation than to
reconstruct it by hand once the model has finished.

The workflow runs entirely on local hardware, composites through an explicit mask, and
colour-matches the generated region back to the untouched plate. Outside the feathered
mask edge, the output file is pixel-identical to the input file.

What the workflow does

The pipeline follows the logic of a layered Photoshop document rather than that of a
generative prompt.

The object is loaded as a transparent PNG. ComfyUI separates such a file into an image and
a mask on load, so the two are padded to the plate’s dimensions and rejoined into a single
RGBA image; a cut-out therefore does not need to match the plate’s canvas size. A transform
node scales, rotates and positions it, and the result is flattened onto the plate. At this
point the composite is deliberately crude โ€” a hard-edged paste-up, exactly what a layer
looks like before any retouching.

The object’s alpha is then converted into a mask, expanded and feathered. That expansion is
the working area: the room the model is permitted to use for cast shadows and light spill.
The model receives the flattened composite together with this mask, and at a reduced denoise
value it is obliged to treat the existing pixels as an anchor. Its task is reduced to
calculating the illumination.

Two subsequent stages do the work that determines whether the result is usable.

The first is colour correction. Because the plate passes through the variational
autoencoder during sampling, and VAE round-trips desaturate, the decoded region no longer
matches the surrounding image. The workflow measures the colour statistics of the
untouched part of the plate โ€” using the inverted mask as a reference region โ€” and pulls
the generated area back to them in LAB space, which behaves more predictably for this
operation than RGB.

The second is the composite itself. The colour-corrected region is pasted onto the
original background file through a heavily blurred mask. Everything outside that feathered
edge is the original pixel data, unmodified. The workflow ships with a comparison slider
and a difference map so that this can be verified rather than taken on trust; the
difference map is near-black by design, which is the point.

[image: a screenshot of the graph in ComfyUI with comments in English and Hungarian]

Three things that were not obvious

Documenting the workflow surfaced several details that are worth stating plainly, because
they are the sort of thing that costs an evening to rediscover.

Mask polarity is inverted relative to intuition. ComfyUI’s LoadImage node returns
MASK = 1 โˆ’ alpha, and JoinImageWithAlpha inverts it back. In that convention zero means
opaque and one means transparent โ€” the opposite of the selection-style masks used elsewhere
in the same graph. Padding an alpha channel with a black canvas therefore produces an
opaque black border rather than a transparent one. The published graph contains two
SolidMask nodes with opposite values for exactly this reason.

One denoise value is asked to govern two different decisions. How much the object
itself may change and how much the ground beneath it may change are separate questions with
separate correct answers. A cast shadow tolerates complete freedom; the object’s geometry
does not. The workflow splits the mask into two tiers โ€” full authority in the halo around
the object, reduced authority over the object body โ€” so that the two can be set
independently.

Step count and denoise are coupled. The effective number of denoising steps is
approximately steps ร— denoise, and a distilled model still requires around four of them.
Reducing denoise to 0.5 while leaving the step count at 4 yields two effective steps and a
noisy result. The step count has to be raised to compensate. This is a common enough
mistake that it is worth stating explicitly.

Requirements and limitations

The workflow is built on FLUX.2 Klein 9B in fp8, which uses Qwen 3 8B as its text encoder
and requires its own dedicated VAE. Four ComfyUI node packs are needed; the README lists
them with links, and ComfyUI Manager will resolve them automatically once the workflow is
loaded.

The limitations are worth stating as plainly as the capabilities.

It does not outperform a modern autoregressive editor on integration quality. It
outperforms them on control, colour fidelity, privacy and cost.

VRAM consumption scales with the full canvas unless the crop-and-stitch stage is enabled,
because the entire plate is encoded during sampling. With that stage active the model
samples only the masked region at native resolution, which is both the memory fix and the
quality fix on large images.

It places a cut-out; it does not create one. The alpha channel is an input, not an output.

It cannot correct perspective. The model computes light, not geometry. If the object’s
camera angle disagrees with the plate’s, no denoise value will reconcile them โ€” that is a
ControlNet or a 3D-rendering problem.

Finally, the supplied parameter values are a starting point rather than a tuned recipe.
They are the values that produced the bundled example. The correct settings are
image-dependent, and the reasoning behind the trade-offs is annotated directly on the graph.

Availability

The workflow, an annotated graph, example images and full documentation are available at
https://github.com/tenpel/ComfyUI-PS-Composite under the MIT licence. The models and
node packs it depends on carry their own separate licences.

The graph is annotated in English and Hungarian throughout. It is intended to be read as
much as run.

Bidirectional SAM2 Tracking for Video Inpainting in ComfyUI

Bidirectional SAM2 Tracking for Video Inpainting in ComfyUI โ€” on a 16GB Laptop GPU

A local, open-source pipeline for replacing a subject’s head in a moving video shot, and the SAM2 patch that makes bidirectional mask tracking possible.

A few months ago I published an open-source project on GitHub: ComfyUI-Bidirectional-SAM2-Inpaint. It is an automated video inpainting pipeline built on ComfyUI, combining Wan 2.1 VACE, SAM2 and Qwen2.5-VL, designed to process long shots on limited hardware โ€” the reference machine is a laptop with a 16GB RTX 3080. This post documents how the pipeline works, why the SAM2 tracker had to be patched to propagate in both directions, and the workflow practices that determine the quality of the result.