SynkitFX Tracker
SynkitTracker Draws the HUD Tracking Boxes — Without Object Detection
- image
- mask
- video
- frames
- overlay_mask
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_everyschedule 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
jitterpixels, 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, orhex. - 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.
trackmode 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.
Inputs (28)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| frames | INT | 481–4096 | Frames to render from a still. Ignored when the input is already a video batch. |
| fps | FLOAT | 241–120 | — |
| count | INT | 121–200 | Number of tracker boxes. |
| detector | COMBO | corners | corners = lock onto real image features. random = anywhere. |
| min_distance | INT | 604–1000 | Minimum pixel distance between boxes. |
| box_min | INT | 404–2000 | — |
| box_max | INT | 1404–4000 | — |
| bracket_length | FLOAT | 0.300.05–0.5 | Corner bracket length as a fraction of the box side. 0.5 = full box. |
| line_width | INT | 11–8 | — |
| color_mode | COMBO | palette | 3 options: single, palette, random_hue |
| color | STRING | #C6FF00 | — |
| palette | COMBO | neon | 5 options: neon, pastel, cmyk, rgb, mono_white |
| show_labels | BOOLEAN | true | — |
| label_style | COMBO | index+coords | 4 options: index+coords, coords, index, hex |
| font_scale | FLOAT | 1.000.3–4 | — |
| crosshairs | FLOAT | 0.400–1 | Fraction of boxes that also get a small '+' marker. |
| connections | INT | 80–400 | Number of thin wires drawn between boxes. |
| connect_mode | COMBO | random | 3 options: nearest, random, chain |
| opacity | FLOAT | 1.000–1 | — |
| background | COMBO | original | 3 options: original, black, transparent_black |
| animate | COMBO | hop+jitter | hop = 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_every | INT | 121–600 | Frames between hops. Each box has its own offset so they don't all jump at once. |
| jitter | FLOAT | 2.00–50 | Pixels of per-frame twitch when jitter is on. |
| flicker | FLOAT | 0.100–1 | Probability a box is hidden on a given frame. |
| rewire_every | INT | 60–600 | Frames between re-rolling the wires. 0 = wires stay fixed. |
| seed | INT | 00–4294967295 | — |
| maskopt | MASK | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| frames | IMAGE | — |
| overlay_mask | MASK | — |