SAMPLER
SHADER
ZOOM 1.00×
MODE
sampler
shader
live
GEN SHADER
FX SHADER
fx off
VIDEO
O open file
capture screen
L camera
SPC play/pause
R reverse
flip V
rot 90°
EXPORT
10s
record
LFO
120.0 BPM
LFO 1
AMP
0.50
OFS
0.00
4.0s
LFO 2
AMP
0.30
OFS
0.00
8.0s
LFO 3
AMP
0.30
OFS
0.00
16.0s
AUDIO INPUT
off
mic
vid
tab
BASS
MID
TRE
VOL
MOD DEPTH
50%
HOLD
0%
MIDI
MISC
F fullscreen
RST reset params
? help
DEF default
DROP VIDEO

recur-recur

live visual instrument
Feed it video, camera, or screen capture and route it through stacked real-time GLSL shaders — generative patterns, kaleidoscopes, feedback, colour, distortion — with every parameter tweakable live. Audio, LFOs, and a tap-tempo BPM clock can modulate any parameter. Record output as video. Cast to a second screen for projection.
Panel
◀ tabTap the tab at the bottom centre of the screen to open / close the control panel
grip stripTap the grip at the top of the panel to close it. Drag it up/down to resize the panel height
ZOOMGlobal zoom slider in the header — scales the canvas output. Useful when the device resolution is larger than the display area. Tap 1:1 to reset
param slidersThe upper slot shows the active shader's parameters — scroll it independently. The lower body scrolls separately
Signal flow strip
top row (GEN)Shows the active generative shader chain. Each block shows a short abbreviation — hover for the full name. Click to select its params
bottom row (FX)Shows the active FX chain. Blocks use abbreviations; hover for full name. A dashed "fx" box means no effects are loaded. Click any block to select its params
drag to reorderDrag blocks within either row to reorder the chain — a green slot highlights the drop position
drag from gridDrag a GEN or FX button from the grid below and drop it onto the flow strip to insert it at that position — dragging the same GEN shader multiple times adds duplicate instances, each with a unique random seed so procedural patterns differ
double-clickDouble-click a block to bypass (disable) it — shown dimmed with strikethrough. Double-click again to re-enable. The shader stays in the chain but is skipped during rendering
drag off stripDrag a block out of the strip area and release to remove it from the chain entirely — including the last GEN shader (SHADER mode will output black with an empty chain)
Modes
SAMPLERPlays a loaded video file as the source texture — open file, drag onto canvas, or use a previously recorded export
SHADERGenerates visuals from GLSL shaders — no video source needed. Optionally blend a video layer over the output
LIVEUses the device camera as the source texture in real time
ENTERCycle SAMPLER → SHADER → LIVE (keyboard)
Video source (SAMPLER)
open fileBrowse for a video file — mp4, webm, mov and most common formats supported
drag & dropDrop any video file directly onto the canvas
capture screenShare your screen or a window as a live source — browser will prompt for permission
SPACE / RPlay/pause · Reverse playback direction
in/out pointsTap the in→out→clr button (or 0 key): first tap sets in-point, second sets out-point, third clears both. Video loops between the two points
flip V / rot 90°Flip video vertically or rotate 90° clockwise (cycles 0/90/180/270)
GEN shaders — generative layers
tap GEN buttonAdd that shader to the chain — multiple shaders stack and blend together (up to 3)
tap againRemove from the chain
drag to stripDrag a GEN button onto the flow strip to insert it at a specific position in the chain
multi-layer blendWhen 2+ GEN shaders are active, a BLEND row appears in params — drag to set mix, tap the mode label to cycle blend modes
4 – 9Keyboard shortcuts to toggle gen shader slots 1–6
FX shaders — effects pipeline
tap FX buttonToggle the effect in/out of the pipeline (up to 3 active; adding a 4th drops the oldest). Badge shows position
drag to stripDrag an FX button onto the FX row of the flow strip to insert it at a specific position
fx off btnBypass all FX instantly — tap again to restore
bitcrush 1-bitEnable the 1-bit toggle in bitcrush params to reduce to pure on/off based on luma. Hue slider sets the "on" colour, threshold sets the cutoff
asciiConverts the image to coloured ASCII characters. Char-size sets character size, invert flips the brightness mapping, mix blends with the original, variation adds per-cell randomness so uniform areas show different characters
halftoneClassic RGB halftone screen — each colour channel is rendered as a grid of dots at its own angle (R-angle, G-angle, B-angle) and cell size (R-size, G-size, B-size). Default angles approximate traditional printing screens (R=15°, G=75°, B=0°). Mix blends with the original image
levelsTone-curve adjustment (Photoshop/GIMP Levels) — shows a live curve canvas with 5 control points (blacks, shadows, midtones, highlights, whites). Drag a point up/down to reshape the tone curve. Bezier tangent arms show curve slope. All 5 points support audio, LFO, and MIDI modulation via the param sliders below the canvas
sample-holdFreezes the screen at random intervals driven by a noise generator — rate slider controls how often a new sample is taken (slow = long freezes, fast = rapid flicker)
Parameters
param sliderDrag horizontally to change value. Tap a row to select it (highlighted). Some params are toggles (☐/☑) — tap to flip
GEN / FX layerTap the GEN or FX layer buttons to switch which shader's params are shown in the upper slot
audio badgeEach param row has an audio badge (—/B/M/T/V). Tap to cycle: none → bass → mid → treble → volume. The selected band drives that param with audio level
LFO badgeEach param row has an LFO badge (—/L1/L2/L3). Tap to assign an LFO to that param — cycles through LFOs then back to none. Audio and LFO modulation add together
1 / 2 / 3Keyboard: next param · decrease · increase
BKSPSwitch layer: gen ↔ fx (keyboard)
LFO — low frequency oscillators
3 LFOsThree independent LFOs each with shape, amplitude, and period controls. Output is always positive (0 to amp) so it adds to the base parameter value
shapes∿ sine · △ triangle · ⊿ sawtooth · ⊓ square · S&H random sample-and-hold
AMPHow much the LFO adds to the parameter — 0 = no effect, 1 = full range
OFSOffset shifts the LFO floor — the parameter oscillates between OFS and OFS+AMP instead of 0 to AMP. Raise it to prevent the parameter hitting zero
SEC modePeriod set in seconds (0.1s – 30s). Drag the period slider to adjust
BPM modeTap SEC to switch to BPM — period snaps to musical divisions of the global tempo: 1/8 · 1/4 · 1/2 · 1 · 2 · 4 · 8 · 16 beats
TAPTap repeatedly to set the global BPM — averages up to 8 taps, resets if gap exceeds 3 seconds
SYNCCopies LFO 1's period and mode (SEC or BPM) to LFOs 2 and 3, then resets all three phases to zero simultaneously — locks them to the same tempo and beat
assign to paramTap the LFO badge on any parameter row to cycle through L1 / L2 / L3 / none. Audio and LFO signals are summed
MIDI control
device pickerSelect your MIDI controller from the dropdown in the MIDI section — the dot turns green when connected. Works with any class-compliant USB or Bluetooth MIDI device
channelSet the MIDI channel to listen on (1–16) or All to receive from every channel. Useful when a device sends on a specific channel or when multiple devices share the same port
MIDI badgeEach parameter row has a MIDI badge (—). Tap it to enter learn mode (badge pulses yellow ●) — a popup appears where you can type a CC number (0–127) and press Enter, or just move a knob/fader on your controller to bind automatically
bound badgeShows the CC number (e.g. C7) when bound — the controller directly sets the parameter value. Tap again to clear and re-enter a new binding. Press Escape or click outside the popup to cancel
stackingMIDI, audio modulation, and LFO all stack — MIDI sets the base value, then audio and LFO add on top
persistenceCC bindings are saved with presets and the share URL
Audio modulation
off / mic / vid / tabSelect the audio source — off disables, mic uses microphone, vid uses loaded video audio, tab shares another browser tab (enable "Share audio" in the permission prompt)
BASS / MID / TRE / VOLReal-time level meters for each frequency band
MOD DEPTHHow strongly the selected band drives the selected parameter — 0% = none, 100% = full sweep
HOLDPeak-hold decay — 0% = instant follow, higher values let transients sustain before falling back
Blend modes — per-shader compositing
stack orderIn SAMPLER and LIVE modes, the video/camera sits as the base layer. Each GEN shader composites on top of it in chain order
blend rowWhen a GEN shader is selected, a BLEND row appears at the top of its params. Drag it to set how much that shader mixes onto the layer below it
mode labelTap the mode label in the blend row to cycle through compositing modes: normal · add · screen · multiply · difference · lighten · darken · overlay · dodge · burn
◉ CAMTap the camera icon in the flow strip to enable/disable the live camera. In LIVE mode this is the base layer; in SAMPLER mode the loaded video is the base
Export video
EXPORT sliderSet the recording duration (5s – 120s)
record btnOpens filename dialog — enter a name and tap record. Button counts down; tap again to stop early
save dialogTap SAVE to trigger the platform save/share sheet (iOS: Files or AirDrop; desktop: choose location). Tap DISCARD to delete
formatSaves as mp4 where supported, webm otherwise — both can be reloaded as SAMPLER sources
iOS tipIf the save sheet doesn't appear, use iOS Screen Recording (swipe to Control Centre, tap record) to capture the full screen
Projection / dual screen (CAST)
CAST buttonOpens a second browser window showing only the canvas — no controls. Use on a projector or second screen
● CAST indicatorPulses cyan when an output window is connected. All param changes, shader switches, LFO and audio sync automatically via BroadcastChannel
fullscreenThe output window requests fullscreen automatically — if blocked by the browser, click anywhere in it or press F
SAMPLER / LIVEThe output window cannot share the control window's video or camera — load the same file (O key or drag) or start the camera (L) separately in the output window
same machine onlyBroadcastChannel works within the same browser on the same device only
Save / Load / Share
SAVEStore the full current state as a named preset in the browser — shader chain, FX chain, all params, LFO config, blend settings
LOADRestore a saved preset — lists all stored presets with timestamps
SHAREGenerate a compact URL with all settings encoded — all per-slot parameters, FX blend amounts, chain order, LFO/audio/MIDI modulation are preserved. Bookmark or share to reload exact state on any device (video file not included)
RSTReset all shader and FX parameters to defaults, keeping the current chain
DEFRevert to initial state — clears the FX chain, resets the GEN chain to a single shader with default params, and clears all blend and mod settings
Keyboard shortcuts
ENTERCycle mode: SAMPLER → SHADER → LIVE
FToggle fullscreen
LToggle camera
OOpen video file
SPACEPlay / pause (SAMPLER)
RReverse playback (SAMPLER)
0SAMPLER/LIVE: in → out → clear. SHADER: cycle selected gen
4 – 9SHADER: toggle gen shaders 1–6
− / +Toggle previous / next FX slot
/SHADER: toggle video blend. SAMPLER/LIVE: bypass all FX
*SHADER: cycle blend mode. SAMPLER/LIVE: next FX slot
.Toggle feedback trail
1 / 2 / 3Next param · decrease · increase
BKSPSwitch param layer: gen ↔ fx
?Show / hide this help screen
CC
WebGL2 not supported in this browser.

RECORDING COMPLETE

Camera Access

On most browsers: click the camera icon in the address bar, set to Allow, then reload.

Save Preset

⚠ Video files are not saved — only shader settings and parameters.

Load Preset

Share Link

All current settings are embedded in this URL. Video files are not included.