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
ZOOM & CHAINSFolds away the zoom / render-scale row, the GEN-FX-SRC flow strip and the audio line in one go, leaving the mode buttons and the param sliders. Handy on a phone when you only want to ride the sliders. While it is folded the flow strip stops rebuilding itself, so it saves a little work as well as space
PARAMS headerThe slider area has its own header above it, which folds the sliders away the same as any other section and names the shader they belong to — so you can still see what is selected with the sliders hidden
section headersEvery heading in the lower body — GEN SHADER, FX SHADER, VIDEO, LFO, AUDIO INPUT, MIDI, MISC — is a show/hide toggle. Tap one to fold that section away; the arrow on the right points down when open and right when closed. Useful on a phone where the panel would otherwise be a long scroll. VIDEO, LFO, AUDIO INPUT, MIDI and MISC start closed since they are mostly set-and-forget; GEN SHADER and FX SHADER start open. What you collapse from then on is remembered between sessions
MODE buttonssampler / shader / live sit at the top of the panel, directly under SAVE / LOAD / SHARE / CAST, so they stay visible instead of scrolling away with the rest of the body
RNDRandomise, at the far left of the zoom row. Fills the GEN chain with 4 different shaders and the FX chain with 4 different effects, rolls every param, picks blend modes and amounts, re-rolls the per-slot seeds, re-rolls all three LFO oscillators (shape, period and amp — your BPM on/off choice is left alone) and assigns two to four of them onto random params so the result moves. Switches to SHADER, since the GEN chain is bypassed in SAMPLER and LIVE and you would not see the result otherwise. Blend modes are weighted rather than uniform: multiply, darken and burn each remove light, so a flat random pick would land on a black frame a good share of the time, and the first slot is always normal at full because it composites onto black. Snapping params land exactly on a position, so style selectors give you a real variant rather than something halfway between two. Audio and MIDI bindings are left untouched. It replaces both chains outright — save or share anything you want to keep first
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. Arriving here bypasses the whole GEN chain so the video shows straight through: both this and LIVE are about the source, and landing in one with the shader stack painted over the top hides the thing you just switched to look at. The chain is kept intact — the blend button in the source row puts it back in one tap
SHADERGenerates visuals from GLSL shaders — no video source needed. Optionally blend a video layer over the output. Arriving here undoes an all-bypassed chain, since SAMPLER and LIVE both leave one behind and you would otherwise land in the mode built for shaders and see none. If you have muted only SOME slots from the flow strip that selection is kept — only the everything-off state is cleared
LIVEUses the device camera as the source texture in real time. Like SAMPLER, arriving here bypasses the GEN chain so the camera shows straight through
ENTERCycle SAMPLER → SHADER → LIVE (keyboard). Each mode arrives set up for what that mode is about — see the three entries above
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 forwards · Play/pause backwards
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 4; adding a 5th drops the oldest)
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 (the first six of the twelve; the rest are panel-only)
style slidersplasma, flowing-colours and zoom-clouds each carry a style selector with eight variants, plus extra shaping params. In every case style 0 with the new params at zero is exactly how that shader behaved before they were added, so old presets are unchanged — the variants are opt-in
plasmaInterference-field generator. speed/scale/warp/palette work as before. style picks the family, snapping through eight types: 0 classic (the original four-sine field), 1 fractal (the same field stacked over octaves), 2 warped (domain-warped fractal — the field displaces its own coordinates, giving slow organic cloud motion), 3 ridged (creased at every zero crossing, veined and marbled), 4 marble (a sine banded by turbulence — wood-grain and stone), 5 ripples (concentric rings modulated by the fractal field), 6 julia (an actual escape-time fractal, animated by walking c around a circle and coloured by banding the orbit-trap distance; scale is the zoom here rather than frequency — the heaviest style, drop render scale if it chugs), 7 flow (the field advects along itself into streaming filaments). detail sets fractal depth, 1 to 4 octaves, and opens up the falloff between them — it does nothing on style 0. contrast squeezes the field toward its extremes, turning smooth gradients into hard bands. fold applies up to three kaleidoscopic mirror-and-rotate passes for self-similar symmetry. drift walks the whole field along a slow bounded orbit so the pattern travels instead of standing still. All five sit at 0 on presets saved before they existed, and style 0 with detail 0 is exactly the old plasma
flowing-coloursBreathing colour-flow field. speed/detail/warp/hue/zoom work as before. style snaps through eight types: 0 classic (the original field), 1 layered (the same field stacked over octaves), 2 warped (the field displaces its own coordinates — slow organic churn), 3 veins (folded at every zero crossing), 4 contour (topographic banding), 5 vortex (rotated by radius so the field winds into a spiral), 6 moire (two counter-rotated copies multiplied, giving beat patterns a single field cannot make), 7 liquid (soft-thresholded into rounded masses that merge and split). layers sets octave depth 1 to 3 — each octave is six sines so it costs more than it looks, and it does nothing on style 0. contrast pushes toward the extremes, widening the flat saturated regions. fold adds up to three kaleidoscopic mirror passes. steady is the useful one live: the original multiplies the whole field by sin(t/10) so it periodically washes out to flat — at 0 that behaviour is kept, at 1 the amplitude holds constant. vivid boosts saturation. All six sit at 0 on presets saved before they existed, and style 0 with steady 0 is exactly the old flowing-colours
zoom-cloudsDomain-warped cloud field. speed/detail/warp/hue/zoom work as before. style snaps through eight types: 0 classic, 1 billow (folded noise — cumulus rather than haze), 2 wispy (finer scale, thin cirrus), 3 marble (the field banded through a sine), 4 ridged (inverted turbulence, sharp veins filling the frame), 5 storm (extra warp on folded noise, dark and violent), 6 contour (topographic bands), 7 streaks (stretched horizontally into wind-blown layers). contrast is the one worth reaching for: the original ramp blows about half of a typical frame out to flat cream, so this pulls the ramp gain back as you raise it while steepening the curve — you recover the washed-out highlights and get more definition at the same time, rather than trading one for the other. rough raises the octave falloff from the original 0.5 up to 0.78, making the clouds progressively grainier — the fine detail gains weight relative to the broad shapes, and the field is renormalised so raising it adds texture rather than just brightening everything. relief fakes lighting from the field's gradient, giving the clouds volume instead of a flat wash — it is normalised against render resolution, so it looks the same at every RES setting rather than changing strength when you drop the render scale. drift runs the outer warp layer faster than the inner one so they shear past each other rather than boiling in place. palette blends the fixed blue-to-cream ramp toward a full colour palette. All six sit at 0 on presets saved before they existed, and style 0 with rough 0 is exactly the old zoom-clouds
voronoiCellular / particle field. density now scales up to ~44 cells across; speed sets motion; edge softens cell boundaries; palette picks colour. mode selects the look: cells (distance-shaded), borders (cracked-cell network), mosaic (flat colour per cell), or particles (dark field of dots). size sets the dot radius and glow adds an additive halo, so cell centres render as points on top of any mode. swarm blends independent jitter into coherent flow-field motion where neighbouring points stream together like a flock. warp bends the lattice for organic, non-grid cells
squarewavesInterference-wave field, now layered and audio-reactive. amplitude/wavetype/frequency/hue/zoom/softness/rotation work as before. detail stacks octaves for depth (and adds a motion-smear trail); warp bends space with the wave itself for a liquid look; fold applies kaleidoscopic domain folding for fractal structure; relief fakes 3D lighting from the wave gradient to kill the flatness. audio brightens the field per-column with the live spectrum (needs audio enabled; fades out in silence). Heavier at high detail — drop detail or render scale if it chugs on mobile
oscilloscopeDedicated audio-waveform visualiser (needs audio enabled — mic/tab/video). style picks the display: line, filled, mirrored, bars, or radial (circular scope). thickness sets stroke width, scale/gain set the vertical size and sensitivity, hue the colour. persistence leaves a slowly-fading trail of past waveforms (up to ~1s), outline draws a bright edge on the filled styles, glow adds a halo, brightness lifts the background. When audio stops the trail ages out and fades on its own. Use an 'add' blend mode to overlay it on video/other layers
kaleidoscopeRadial mirror pattern generated from its own wave field — unrelated to the mirror and kaleido-warp effects, which fold incoming video instead. sides snaps from 3 to 12 segments, spin rotates the fold (centre is still, either side turns opposite ways), zoom scales the pattern inside each wedge, palette picks the colour ramp. The fold angle is eased so the seam where segments meet stays invisible while the mirror lines themselves stay sharp
tunnelPerspective tunnel — rings rushing toward you with segments running down the walls. speed drives the travel, segs sets how many segments go round (rounded to a whole number so the seam at the back closes cleanly), twist shears them into a helix that tightens with radius, zoom and palette as usual. The centre fades out rather than collapsing to a point
hypnotic-ringsThree sets of concentric rings, one per colour channel, thrown from sources that orbit each other — the interference between them is the effect. speed drives the orbit, freq sets ring spacing, orbit sets how far the two main sources swing from centre, hue rotates the result. softness takes the ring edges from hard bands to a smooth gradient. wavetype morphs the ring profile sine → triangle → sawtooth. drift adds a slower independent wander to all three sources so the pattern stops repeating on a fixed cycle
starfieldTwo independent star emitters, ported from the Pi recur project. Stars run along fixed radial lanes — stars sets how many, up to 500. e1-speed and e2-speed control each emitter: centre is still, above centre throws stars outward, below centre pulls them inward. e1-trail/e2-trail stretch each star into a streak, e1-size/e2-size set the dot (stars grow as they travel). e2-x and e2-y place the second emitter anywhere on screen while the first stays centred, so you can run an outward and an inward field at once. palette and zoom apply to both
gamma-raySingle-frame particle noise — every pixel is re-randomised each frame, so it flickers rather than drifting. density sets how many particles land, on a curve that keeps the low end sparse; brightness scales them; size sets the dot from 1 up to 6 pixels. colour at 0 is white, and raising it sweeps through the phosphor and scintillator colours — green, blue, red. Works well over video on an add or screen blend
FX shaders — effects pipeline
tap FX buttonToggle the effect in/out of the pipeline (up to 4 active; adding a 5th 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 blend + mixEvery FX slot has its own BLEND row at the top of its params, same as a GEN layer. Tap the mode label to cycle the compositing mode and drag the mix row to set how much of the processed image comes through. mix is wet/dry: 1.00 is the full effect, 0.00 is the untouched input. With a non-normal mode the effect output is composited back over its own dry input — e.g. difference on an edgy effect leaves only what the effect changed, add keeps the original and layers the effect's brightness on top, and multiply darkens where the effect is dark. The slot still feeds the next one in the chain, so modes stack down the pipeline
fx off btnClears every FX shader, its params, and mod bindings from the chain instantly — not reversible from the button itself. For a temporary, reversible bypass, double-click a block in the flow strip instead
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 — it jitters the brightness each cell reads before choosing its glyph, so the character mix loosens while the image still reads. charset picks which alphabet the glyphs come from: 0 all (every block together — what presets saved before this param get), 1 ascii (the full 95-character printable set, the default for new instances), 2 ascii+katakana, 3 katakana only, 4 CJK only. Each set is ranked by ink coverage on its own, so every charset gives a correct dark-to-light ramp rather than a slice of someone else's. rate sets how much the characters churn: it raises both the tick speed — from about one change every 2.5 seconds up to 14 a second — and how far each re-roll is allowed to move along the character ramp. Because the colour of each cell is sampled from the video every frame regardless, a low rate gives you a character that holds still for a beat while its colour keeps shifting with the footage, and a high rate gives a busy flickering lattice. It works on its own and stacks on top of variation
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)
glitchDigital corruption stack. intensity = horizontal slice displacement; rate = how fast the glitch state jumps; channel = RGB split; slices = number of horizontal bands, scaling all the way up to one-per-scanline (per-pixel) at max; variation = pulls neighbouring slices together and occasionally stretches a band to a single repeated line. blocks = macroblock corruption, modelled on how a codec actually fails: a run of consecutive blocks along the scan share one wrong motion vector, so damage arrives as coherent horizontal drags of varying length rather than evenly scattered squares, and it runs at two block sizes at once so the chunks are not all the same size. Displacement snaps to the block lattice, which is what makes it tile like block damage instead of smearing. noise = digital dropout, cycling the failure modes a broken MPEG/JPEG frame really shows — DC-only blocks (detail gone, flat average colour), scrambled-AC blocks (a DCT basis wave showing through as a striped ripple), chroma desync (luma survives, colour comes from the wrong place) and channel roll. Dropouts share the run structure and cluster on blocks that are already displaced, so the two read as one fault. crush = colour bit-crush/quantise (down to ~2 levels), wave = analog sine warp / horizontal wobble. New features sit at 0 (off) on presets saved before they existed
scatterCuts the frame into a square grid and rearranges it. grid sets how many cells across, from a handful of big slabs up to 48 fine tiles. shuffle is how far a cell may travel, up to ten cells away, and amount is how many of them move at all — the rest pass through untouched. pixelate quantises inside each cell, from full detail down to one flat colour per tile. rate re-rolls the arrangement on a timer; at 0 it holds still, so you get a fixed scramble rather than a churn. seam darkens a border inside each cell so the grid reads as laid tiles. mode picks how cells move: 0 scatter (each jumps somewhere random), 1 swap (cells trade in pairs — a true permutation, so nothing is duplicated or lost), 2 rows (whole rows slide sideways), 3 columns (whole columns slide vertically), 4 spin (cells stay put but their contents rotate in 90 degree steps)
feature-dotsTracks corner features in the image (Shi-Tomasi detection + Lucas-Kanade optical flow) and marks them with coloured dots that move with the structure they're tracking. Pitch sets dot spacing, sensitivity sets how readily a point is treated as a feature, dot-size and jitter shape the dots, tint/backdrop/gamma control colour, track blends tracked motion in, and settle controls how strongly dots relax back toward their grid position each frame — too little and the field shears apart, too much and dots snap back to the lattice
vhsAnalog tape emulation. chroma pulls red and blue apart horizontally, scanlines darkens alternate lines, noise adds per-pixel grain, and tracking jitters whole scanlines sideways at random — the tape-alignment wobble. A slight desaturation and warm tint are applied on top
posterizeReduces the image to a small number of colour steps — levels sets how many, 2 to 16 per channel. contrast is applied after the quantisation, so it hardens the edges between bands rather than creating more of them. tint-hue rotates the hue of the posterised result, centre being no shift. mix blends back against the original
colorizerReplaces the image colour with a hue derived from its brightness, then scrolls that mapping over time. bands sets how many times the hue wraps across the brightness range, speed scrolls it, spread is the saturation. Unlike hue-cycle the mapping stays continuous, so gradients come out smooth
hue-cycleThe banded counterpart to colorizer: brightness is quantised into steps first and each step gets its own hue, giving flat blocks of colour instead of a sweep. bands sets how many, speed scrolls the hues through them, saturation and amount as usual
hsv-shiftDirect HSV adjustment. hue rotates the whole image (centre is no change), saturation multiplies from a fifth up to double, value from a third up to 1.7x. amount blends against the original, so it doubles as a strength control
kaleido-warpFolds the incoming video into mirrored wedges — the video-processing counterpart to the kaleidoscope generator. sectors snaps from 2 to 16, spin rotates the fold over time with centre being still, and centre-x / centre-y move the fold origin anywhere in the frame
rotate-zoomPlain geometric transform. spin covers a full turn across the slider with centre at no rotation, zoom scales from a tenth up to 4x, and centre-x / centre-y set the pivot. Edges clamp rather than wrapping, so pushing past the frame smears the border pixels
zoom-fxZoom with a heartbeat. zoom scales from a quarter up to 3x about the chosen centre, and pulse adds a continuous sine breathing on top. At pulse 0 it is a static zoom
Parameters
param sliderDrag horizontally to change value. Tap a row to select it (highlighted). Some params are toggles (☐/☑) — tap to flip
pattern centringEffects built on a repeating grid used to measure that grid out from the bottom-left corner of the frame, because that is where the coordinate origin sits. It looked fine standing still, but animating the size — especially from an LFO — slid the whole pattern diagonally out of that corner instead of scaling in place. bitcrush, ascii, halftone and feature-dots now count their grids out from the CENTRE of the frame, so a size sweep grows and shrinks around the middle and whatever is in the centre of shot stays put. halftone gained the most: its angle sliders rotate about the origin too, so they used to swing the entire screen around the bottom-left corner rather than spinning the dot screen in place. gamma-ray, grain, oscilloscope and scatter are deliberately unchanged — measured, they gain nothing, and scatter's grid has to stay an exact tiling for its swap mode to remain reversible. Existing presets shift by under half a cell standing still; the difference is only obvious in motion
snapping slidersSome params are selectors rather than continuous values and snap to fixed positions as you drag: style on plasma, flowing-colours and zoom-clouds, charset on ascii, sides on kaleidoscope, and sectors on kaleido-warp. The row shows the position number rather than a decimal, and the help entry for that shader lists what each one is
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
MIDI badgeEach param row also has a MIDI badge (—). Tap it to bind a CC — see the MIDI control section. MIDI sets the base value, then audio and LFO add on top of it
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
shapesFive icon buttons: sine, triangle, ramp, square, and sample-and-hold (stepped random). The icons are drawn as vectors rather than text characters, so they render the same on every platform
SKWSkew — warps the waveform's timing without changing shape. At 0.50 the wave is symmetrical. Slide it up and a triangle's peak moves toward the end (becoming a ramp up), a square's duty cycle widens, and a sine gains a slow rise with a fast fall; slide it down for the mirror image. Works on every shape
CRVCurve — bends the path between low and high. At 0.50 it moves linearly. Below that the value accelerates toward the peak, giving a spiky fast-attack shape good for stabs; above it the value eases in and lingers at the top, giving a plateau. Applies to sample-and-hold too, reshaping the distribution of held values
previewThe mini waveform at the right of each LFO row shows the actual output including amp, offset, skew and curve — the faint horizontal line is the offset floor
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
enable MIDIMIDI is opt-in — tap "enable MIDI" in the MIDI section to request device access. Nothing connects automatically on load
device pickerOnce enabled, select your MIDI controller from the dropdown — 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
FX blend rowFX slots have the same two rows, but they mix the effect against its own input rather than against the layer below. The full list of modes is identical
normal vs the restnormal at mix 1.00 is a plain serial effect — nothing is composited, so it costs nothing extra. Any other mode always runs a compositing pass, even at mix 1.00
◉ CAMTap the camera icon in the flow strip to turn the live camera on/off directly. In LIVE mode the camera is the base layer; in SAMPLER mode the loaded video is the base
Source section
appears automaticallyA permanent row of source controls appears just below the SAVE/LOAD/SHARE/CAST buttons whenever the camera is on, or LIVE or SAMPLER mode is selected — no need to open anything
SAMPLER transportA row of icon buttons matching the SRC row: play/pause (the icon shows what tapping will do, and the caption follows it), reverse — which works the same way, playing backwards and then pausing, with the play button being how you return to forwards — restart to the in-point, open a file, loop, and ping-pong. Each lights when active, and only one direction can be lit at a time. Speed sits on its own row as text pills, and the in/out slider gets a full row to itself since it needs the width
play from a dead spotIf the playhead is outside the in/out range — which is where dragging the out handle leaves it — play snaps back to the in-point instead of resuming into a dead spot and stopping again. Pausing and playing anywhere inside the range resumes where you left off; restart always jumps to the in-point
SAMPLER: restartJumps back to the in-point (or the start) and plays forward from there
SAMPLER: open file…Same as the O key / open file button elsewhere — opens the file picker dialog to load a video
SAMPLER: SPEEDA continuous slider from ¼× to 4×, log-mapped so 1× sits dead centre and every doubling covers the same distance. It has soft detents — land within a hair of ¼ ⅓ ½ ¾ 1 1¼ 1½ 2 3 4 and it grabs the round number, otherwise you keep whatever you dragged to, shown to two decimals beside it. The 1× button snaps straight back to normal. Applies to forward playback and to reverse/ping-pong stepping, and carries over when a new file is loaded
SAMPLER: LOOPOn (default): restart at the in-point (or the start) once the out-point (or the end) is reached. Off: playback stops there instead of restarting
SAMPLER: PING-PONGBounce direction at each boundary instead of restarting — plays forward to the out-point, then reverses to the in-point, and repeats. Overrides LOOP while enabled
IN / OUT previewDragging a handle parks the playhead on it — the in handle shows the frame you are starting from, the out handle the frame you are ending on — so you can set points by eye. Playback holds still while you drag and picks up again when you let go
SAMPLER: IN / OUTA slider spanning the whole clip. Drag the left handle to set the in-point and the right handle to set the out-point — playback loops (or ping-pongs) between them, and the cyan bar shows the live playhead. Drag a handle fully to the start/end to unset it; clr resets both. Stays in sync with the 0-key in/out method
SRC iconsTwo tight groups with a gap between them: camera on/off plus front / rear facing (a face in a frame for the selfie camera, a landscape for the rear), then rotate, flip and mirror. The camera group only appears in LIVE, or whenever the camera is running — in SAMPLER the source is a file, so it would only be a mode switch you already have above. Each icon lights when active and rotate shows its angle. In LIVE the camera icon stays lit and does nothing when tapped; the L key still toggles LIVE from the keyboard
FACINGSwitch between front and rear camera — only shown on touch devices, since desktops generally ignore facing mode
rotate / flip / mirrorThe last three icons in the SRC row: rotate the source 90° at a time (the icon shows the current angle), flip it vertically, mirror it horizontally. Each lights when active
BLEND rowOnly appears in SHADER mode, since that is the only mode that composites generated output against footage. The two overlapping circles mark the row; the two icons pick what it blends against — a play symbol for the loaded video, a camera for the live camera. The on/off button toggles the blend, and the text beside it shows the current mode and amount, which are set from the BLEND row in the params above
blend toggleThe rightmost icon in the SRC row, marked blend. One switch: either the source plays straight through, or the whole generative stack is composited over it. It only appears in SAMPLER and LIVE, the two modes that bypass the gen chain by default so the shaders don't hide your footage — SHADER bypasses nothing so it isn't needed there. For per-slot control, double-click blocks in the flow strip
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 modes and mix 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. SAMPLER and LIVE arrive with the GEN chain bypassed so the source shows through; SHADER arrives with it restored
FToggle fullscreen
LToggle camera
OOpen video file
SPACEPlay / pause (SAMPLER)
RPlay backwards, or pause if already reversing (SAMPLER). Press SPACE to go forwards again
0SAMPLER/LIVE: in → out → clear. SHADER: cycle selected gen
4 – 9SHADER: toggle gen shaders 1–6
− / +Toggle previous / next FX slot
/Clear the entire FX chain (same as the fx off button) — works the same in every mode
*Toggle next FX slot — same binding as +
.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.