Nodes/msch-synkitfx/SynkitFX Tracker
ComfyUI Node

SynkitFX Tracker

SynkitTracker Draws the HUD Tracking Boxes — Without Object Detection

By mariobilly·Created a day ago·Updated a day ago· 1
SynkitFX Tracker
  • image
  • mask
  • video
  • frames
  • overlay_mask
frames48
fps24
count12
detectorcorners
min_distance60
box_min40
box_max140
bracket_length0.30
line_width1
color_modepalette
color#C6FF00
paletteneon
show_labelstrue
label_styleindex+coords
font_scale1.00
crosshairs0.40
connections8
connect_moderandom
opacity1.00
backgroundoriginal
animatehop+jitter
hop_every12
jitter2.0
flicker0.10
rewire_every6
seed0

You know the look: corner brackets snapping around points of interest, little labels, thin wires between boxes - the sci-fi HUD from every synthwave title sequence. SynkitTracker generates that overlay and animates it, turning a still or real footage into a finished HUD clip. No GPU, no model weights, just numpy and OpenCV.

Read the fine print before you expect magic: the boxes are graphic feature tracks, not recognized objects. This node doesn't know a face from a fire hydrant - it locks onto texture corners and draws the UI on top. Perfect for an aesthetic overlay, the wrong tool if you wanted semantic labels. Set expectations there and it's great at what it does.

It's the other half of the msch-synkitfx pack from mariobilly (SynkitMetablob is the blobby halftone sibling). The two stack: run Metablob first, feed its frames in here, and the boxes land on the stylized footage.

How it works

On the first frame the node hunts for corner features using OpenCV's Shi-Tomasi detector (the same goodFeaturesToTrack machinery computer-vision has used for decades) and parks up to count boxes on them, keeping them at least min_distance pixels apart. Each box gets a random size between box_min and box_max, a corner-bracket style from bracket_length (0.5 = a full rectangle, 0.3 = classic short HUD corners), a line_width, and optionally a small + crosshair at its center (crosshairs sets what fraction get one).

Then it stays alive with one of the animate modes:

  • hop - each box re-picks a fresh feature on its own staggered hop_every schedule so they don't all jump at once. Works on stills - it's just reshuffling within the frame.
  • wander - boxes drift around on a random walk, bouncing off the edges.
  • jitter - a per-frame twitch of up to jitter pixels, for that nervous handheld-HUD feel.
  • track - the real deal for footage: boxes follow features across actual frames via optical flow, re-seeding a fresh corner when a track is lost. Video input only.
  • flicker - a probability per frame that any given box is hidden.

Meanwhile connections thin wires get drawn between boxes in connect_mode (nearest, random, or chain), and rewire_every re-rolls which pairs are wired every N frames (0 keeps them fixed).

The inputs that matter

  • count - number of boxes; 12 reads well, crank it for density.
  • detector - corners (lock onto real image features, the default), random (boxes anywhere), or grid_jitter (an even grid nudged around - nice for a tidy, deliberate layout).
  • color_mode and palette - a single color, one of the built-in palettes (neon, pastel, cmyk, rgb, mono_white), or random hues.
  • show_labels / label_style - labels default to index+coords, but you can show just coordinates, just an index, or hex.
  • mask (optional) - boxes only form inside the masked region, handy for keeping the HUD off a face or a logo.

frames, fps, and seed behave like the rest of the pack: a still becomes frames images at fps, a real batch is processed frame-by-frame.

Outputs and wiring

Three sockets: video (native VIDEO), frames (the composited IMAGE batch), and overlay_mask (a MASK of where the UI is drawn). Feed frames into downstream effects or Save Video and grab video off the final node - the shipped example chains SynkitMetablob's frames in here and sends this node's video to the core Save Video node. Again: transparent_black is black behind the HUD, not real alpha in an MP4 - composite with overlay_mask if you need to.

Install

The git route is the safe one while the pack's ComfyUI Manager listing is still pending:

cd ComfyUI/custom_nodes
git clone https://github.com/mariobilly/msch-synkitfx.git
cd msch-synkitfx
python -m pip install -r requirements.txt   # same Python env as ComfyUI

Windows portable swaps in .\python_embeded\python.exe. Only numpy, torch, and opencv-python - nothing model-heavy. Restart ComfyUI and refresh.

Note the README: this standalone repo is superseded by the author's unified msch-comfyui-nodes pack. Fine to run either - just not both at once (duplicate node registrations) - and follow the migration guide if you switch.

Gotchas

  • It's not recognition. Footage with no texture - flat gradients, clean skies - has few real corners, so boxes hop on whatever faint detail exists. Feed it busy footage or use grid_jitter/random.
  • Even dimensions for H.264, same as any video path here.
  • track mode needs real multi-frame video input; on a still it falls back to the other modes, so don't expect motion on a single image.
  • CPU-only means it's snappy for short clips but don't try to process feature detection + optical flow across hundreds of frames at high resolution and expect instant results.
CategorySynkitFX

Inputs (28)

NameTypeDefaultDescription
imageIMAGE
framesINT481–4096Frames to render from a still. Ignored when the input is already a video batch.
fpsFLOAT241–120
countINT121–200Number of tracker boxes.
detectorCOMBOcornerscorners = lock onto real image features. random = anywhere.
min_distanceINT604–1000Minimum pixel distance between boxes.
box_minINT404–2000
box_maxINT1404–4000
bracket_lengthFLOAT0.300.05–0.5Corner bracket length as a fraction of the box side. 0.5 = full box.
line_widthINT11–8
color_modeCOMBOpalette3 options: single, palette, random_hue
colorSTRING#C6FF00
paletteCOMBOneon5 options: neon, pastel, cmyk, rgb, mono_white
show_labelsBOOLEANtrue
label_styleCOMBOindex+coords4 options: index+coords, coords, index, hex
font_scaleFLOAT1.000.3–4
crosshairsFLOAT0.400–1Fraction of boxes that also get a small '+' marker.
connectionsINT80–400Number of thin wires drawn between boxes.
connect_modeCOMBOrandom3 options: nearest, random, chain
opacityFLOAT1.000–1
backgroundCOMBOoriginal3 options: original, black, transparent_black
animateCOMBOhop+jitterhop = boxes jump to new features every 'hop_every' frames (works on stills). wander = boxes glide around. jitter = per-frame twitch. track = follow real footage with optical flow (video input only).
hop_everyINT121–600Frames between hops. Each box has its own offset so they don't all jump at once.
jitterFLOAT2.00–50Pixels of per-frame twitch when jitter is on.
flickerFLOAT0.100–1Probability a box is hidden on a given frame.
rewire_everyINT60–600Frames between re-rolling the wires. 0 = wires stay fixed.
seedINT00–4294967295
maskoptMASK

Outputs (3)

NameTypeDescription
videoVIDEO
framesIMAGE
overlay_maskMASK