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. |
| 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 | Prime the frame ring with the first video frame immediately on file load. |
| 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
| Control | Range | Description |
| ON | toggle | Enable/disable. |
| BANDS | 0–30 | Number of active displacement bands per frame. |
| BAND HEIGHT | 0–1 | Relative height of each band. |
| RAND SIZE | toggle | Randomise band height per band. |
| 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 | Overall speed multiplier for band drift. |
| GAP | 0–200 | Snaps band positions to a regular grid spacing. |
| OPACITY | 0–1 | Alpha of displaced band content. |
Clusters Group
| Control | Range | Description |
| ON | toggle | Enable cluster-biased tile placement. Glitch must also be ON. |
| CENTERS | 1–20 | Number of cluster centres. |
| SPREAD | 1–300 | Radius around each centre within which tiles are distributed. |
| MIN RAD | 0–150 | Minimum distance from centre — creates a hollow ring. |
| 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. |
| DRIFT | 0–5 | Noise-driven movement of cluster centre positions. |
| SPEED | 0–15 | Speed of cluster centre physics simulation. 0 = static. |
| INERTIA | 0.01–0.99 | Momentum of cluster centres. High = smooth. Low = jittery. |
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. |
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 to localStorage. They survive app restarts.
| Preset | Character |
| clean | All effects off — raw source passthrough |
| chaos | High corruption, deep ring, fast clusters |
| melt | Slow feedback zoom with deep scanlines |
| mirror | Symmetry-forward with light solarise |
| pulse | Rhythmic cluster glitch with trails |
| solar | Solarise dominant, flow warp texture |
| vapor | Soft trails, slow feedback rotation |