huff opens two windows. The controls window is your workspace. The canvas window is the fullscreen output that receives processed frames over the embedded WebSocket relay.
Controls are organised into collapsible groups. Click a group label to collapse or expand it. Collapsing a group does not disable its effects — use the ON toggle inside each group for that.
Source Group
| Control | Description |
| File | Load a video file. Drag-and-drop also works. MP4, MOV, WebM, and any format your system decoder handles. |
| Camera | Select a webcam from the dropdown. Click ↻ Refresh to scan for newly connected devices. |
| ▶ Play / ⏸ Pause | Toggle video playback. Resuming after pause restarts the frame pump automatically. |
| Seek Bar | Scrub to any position in the loaded file. Uses fast keyframe seeking while dragging for low latency; playback resumes automatically on release. |
| Time Display | Shows current position and total duration as M:SS / M:SS. |
| RATE | Playback speed: 0.25×, 0.5×, 1×, 2×, 4×. Applies immediately without reloading. |
| LOOP | Loop the file continuously. Unchecking plays once and stops. |
| VOL | Output volume. Drag to zero to mute. |
| BASE VIDEO | Show the raw source frame underneath the glitch output. |
| BASE MIX | Opacity of the base video layer. 0 = fully glitched output, 1 = raw source on top. |
| BASE BG | Background fill colour when no tile covers a pixel: Black, Green (chroma key), Blue, or White. |
| SEED ON LOAD | Randomise the seed each time a new file is loaded, giving every clip a visually distinct glitch pattern. |
| QUALITY | Scales the frame ring depth (0 → 4 frames, 1 → 60 frames). The single most impactful performance lever. |
| SEED | Randomisation seed. Same seed + parameters = same output. |
Glitch Group
The core datamosh engine. Reads tiles from past frames and blits them onto the current frame at noise-driven positions.
| Control | Range | Description |
| ON | toggle | Enable/disable the glitch pass entirely. |
| CORRUPT % | 0–7 | Fraction of grid tiles displaced per frame. 0 = nothing moves. 7 = every tile replaced. |
| CORRUPT DRIFT | 0–1 | Noise-driven oscillation of corruption density. The percentage breathes slowly when > 0. |
| PIXEL SIZE | 150–2000 | Tile size in pixels. Larger = blockier datamosh. Smaller = fine grain displacement. |
| DEPTH | 0–0.5 | How far back in the ring tiles are sampled. |
| DEPTH SCATTER | 0–1 | Per-tile randomisation of the lookback index. |
| GLITCH SIZE | 1–60 | Spatial scaling of each tile relative to PIXEL SIZE. |
| OPACITY | 0–1 | Alpha of each blit tile. |
| JITTER | 0–1 | Magnitude of per-tile position noise. |
| SMEAR | 0–200 | Duplicate stamps trailed behind each tile. |
| SMEAR ANGLE | 0–360 | Direction of the smear trail. 0 = noise-driven per frame. |
| SPEED | 0–10 | Phase velocity of the noise field driving tile selection. |
| FINE / MULT | 0–10 | Secondary speed multipliers. |
| GLITCH X / Y | -1–1 | Base offset applied to all tile destination positions. |
Feedback Group
| Control | Range | Description |
| FEEDBACK | 0–3 | Contribution of the previous frame. Values > 1 over-expose. |
| PERSISTENCE | 0–10 | Decay rate between frames. Higher = trails linger longer. |
| FB X | -1–1 | Horizontal translation per frame. Creates lateral drift. |
| FB Y | -1–1 | Vertical translation per frame. |
| FB Z | 0.98–1.03 | Zoom per frame. < 1 = implode inward. > 1 = explode outward. |
| FB θ | -2–2 | Rotation in degrees per frame. Creates spinning feedback tunnels. |
| ↺ Reset Motion | button | Returns FB X/Y/Z/θ to neutral (0, 0, 1.0, 0). |
Scanlines Group
Displaces horizontal bands of the current video frame spatially — no temporal sampling from the ring. This means scanlines are smooth and follow live motion without any buffer-trail artifact. The bands shift the current content left or right; they do not pull from historical frames.
| Control | Range | Description |
| ON | toggle | Enable/disable. |
| BANDS | 0–50 | Number of active displacement bands per frame. |
| HEIGHT | 0–120 | Base height of each band in pixels. |
| RAND SIZE | toggle | Randomise band height per band. Heights are stable per video frame — no 60fps flickering. |
| SHIFT | 0–0.5 | Maximum horizontal displacement as a fraction of canvas width. |
| SKEW | -1–1 | Position-based horizontal offset making bands angle diagonally. |
| DRIFT | 0–3 | Vertical drift speed of band positions. |
| SPEED | 0–5 | Speed of band animation. Operates independently of glitch speed — works even with glitch off. |
| GAP | 0–200 | Snaps band positions to a regular grid spacing. |
| OPACITY | 0–1 | Alpha of displaced band content. |
Clusters Group
Biases glitch tile placement toward moving focal points (cluster centres) rather than scattering tiles randomly. Glitch must also be ON. Each centre has its own physics simulation with inertia, steering, and optional velocity bursts.
| Control | Range | Description |
| ON | toggle | Enable cluster-biased tile placement. Glitch must also be ON. |
| CENTERS | 1–20 | Number of cluster centres. Each is an independent physics body that tiles gravitate toward. |
| SPREAD | 1–300 | Radius in pixels around each centre within which tiles are distributed. |
| MIN RAD | 0–150 | Minimum distance from centre — creates a hollow ring of tiles. |
| SPATIAL GAP | 0–200 | Minimum pixel distance between any two tiles. Prevents overlap. |
| BIAS | 0–1 | Fraction of tiles forced into clusters. Remainder placed randomly across the canvas. |
| DRIFT | 0–5 | Adds noise-driven wandering to centre positions. |
| SPEED | 0–40 | Speed of cluster centre physics simulation. 0 = static centres. |
| SPD VAR | 0–2 | Per-centre speed variation. Each centre gets its own speed multiplier so they move at different rates. 0 = all same speed. |
| PULSE | 0–10 | Periodic velocity kick — centres suddenly burst in a random direction then settle. Higher = more frequent bursts. |
| INERTIA | 0.01–0.99 | Momentum of cluster centres. High = smooth gliding. Low = snappy response to steering. |
Global Key Group
A final composite pass applied after all effects, between the clean base video and the fully processed output. Two modes: Luma uses the luminance of the base video to control where processed output shows through. Blend composites layers using a GPU blend operation with no pixel work.
| Control | Range / Options | Description |
| MODE | OFF / LUMA / BLEND | OFF — disabled. LUMA — luminance of the base video gates how much of the processed output shows through; bright areas reveal the effect, dark areas stay clean (flip with Invert). BLEND — composites base over processed using a CSS blend operation; GPU-accelerated, no pixel work. |
| MIX | 0–1 | Overall strength of the key. 0 = no effect, 1 = full. |
| THRESH | 0–1 | Luma mode only. Luminance threshold. 0 = nothing revealed, 1 = everything revealed. Soft rolloff prevents hard edges. |
| INVERT | toggle | Luma mode only. Flips which side of the threshold reveals the processed output. |
| BLEND | SCREEN / MULTIPLY / OVERLAY / DIFFERENCE / HARD LIGHT / ADD | Blend mode only. SCREEN brightens. MULTIPLY darkens. OVERLAY adds contrast. DIFFERENCE inverts where layers differ. ADD saturates quickly. |
Solarize Group
| Control | Range | Description |
| ON | toggle | Enable/disable. |
| THRESH | 0–1 | Luminance threshold. Pixels above this are inverted. |
| AMOUNT | 0–1 | Inversion strength. |
| SOL R / G / B | 0–2 | Per-channel multiplier applied after inversion. > 1 over-exposes that channel. |
Flow Warp Group
| Control | Range | Description |
| ON | toggle | Enable/disable. |
| STRENGTH | 0–20 | Maximum pixel displacement. |
| SCALE | 40–200 | Spatial scale of the noise field. |
| PULSE | 0–200 | Frames back in the ring to sample during warp. Adds temporal smear. |
| IMPLODE | 0–1 | Centripetal pull toward the canvas centre. |
Symmetry Group
| Control | Options | Description |
| SYMM | toggle | Enable/disable. |
| MODE | V / H / HV | Vertical mirror, horizontal mirror, or both. |
| SYM POS | 0–1 | Position of the mirror axis. 0.5 = centred. |
Buffer Trails Group
| Control | Range | Description |
| ON | toggle | Enable/disable. |
| TRAIL LAYERS | 0–10 | Number of ghost frames composited. |
| TRAIL DEPTH | 0–1 | How far back in the ring to pull trail frames from. |
| LUMA KEY | 0–1 | Drops dark pixels from trail frames. Only bright areas trail. |
Presets
Presets save a complete snapshot of all parameter values as a JSON file you download to disk. Load them back at any time — across sessions, machines, or shared with collaborators. The previous localStorage-based system has been replaced.
| Action | Description |
| 💾 Save Preset | Downloads a timestamped .json file containing all current parameter values. |
| 📂 Load Preset… | Opens a file picker. Select a previously saved .json preset. All controls update immediately. |
| Ctrl+Z / Cmd+Z | 10-step undo. Steps back through parameter changes one snapshot at a time. Loading a preset counts as one undo step. |
Keyboard Shortcuts
| Key | Action |
| P | Toggle the control panel. A pill indicator appears at the bottom of the screen reading "UI hidden · P to show" so you can always get back. |
| F | Toggle fullscreen. |
| Ctrl+Z / Cmd+Z | Undo the last parameter change. Up to 10 steps. |