Catoptron turns a photo (or a built-in pattern) into kaleidoscopic, fractal, and conformal art. You build an effect by stacking coordinate “folds” and choosing a renderer that reflects and recurses the result, then dress it with color, framing, and motion. Everything runs live on the GPU — nothing is uploaded.
The idea in one picture
SOURCE FOLD STACK RENDERER GLASS MOTION
image → fold₁ → fold₂ → … → Panes/Droste/… → color/frame → animate
Read it left to right. Each fold bends the coordinate grid; folds compose in order, so the same folds in a different order give a different result. The renderer mirrors/repeats that bent grid into the final structure. Glass handles color and framing. Motion animates it for video.
Best habit: add one fold, see what it does, then add the next. Stacks of 2–4 folds already go a long way.
Quick start
- Source: Load image for your own photo, or pick a built-in pattern (orbs, plasma, rings, stripes, waves, voronoi, truchet, halftone, or a grid/polar/checker probe) and shape it with the Scale / Hue / Variation knobs to learn an effect against a clean reference.
- Renderer: start on Panes.
- Fold stack: pick an operator in the add dropdown and click +. Try Polar fold first — instant kaleidoscope.
- Drag its sliders; add a second fold (Swirl or Spiral).
- Open Presets to see full recipes. Export PNG when happy, or Record / HQ Video for animation.
Renderers
The renderer decides how the folded plane is reflected and repeated. Same stack + different renderer = very different image, so switch often.
| Renderer | What it does | Good for |
| Panes | Straightforward mirrored tiling | Clean kaleidoscopes, learning a fold |
| Droste | Log-spiral recursion (image inside itself) | Infinite zoom, vortices |
| Room | Opposed-mirror corridor | Deep receding reflections |
| Tube | Wraps the plane around a cylinder | Tunnels, wormholes |
| Strip | Repeats along one band | Friezes, ribbons |
| Feedback | Feeds the previous frame back in | Trails, painterly buildup |
| Grid | Repeats the image in a wallpaper grid | Tiled patterns, textiles |
| Kaleido | Reflects into N radial mirror wedges | Classic kaleidoscope |
| Sphere | Wraps the image onto a rotating ball | Planets, crystal balls |
| Slit-scan | Each column samples a different time slice — diagonal motion smear | Time-smear, datamosh motion |
| Poincaré disk | Hyperbolic disk model — the image crowds infinitely toward the rim | Escher-like hyperbolic space |
| Hyperbolic tiling | A reflection group tessellates the disk (Escher “Circle Limit”) | Hyperbolic tessellations |
Shared controls: Depth (reflection/recursion steps), Step scale (zoom per level), Twist (rotation per level), Shift X/Y & Zoom (pan/zoom), mirrored (flip alternating tiles), and Feedback amount + Mosh (datamosh block-displacement of the fed-back frame) — both Feedback renderer only. Feedback also has a Reaction-diffusion mode — Gray-Scott Turing patterns grown from the image, where Pull/Rotate become Feed/Kill (pattern type) and Feedback becomes Image drive (how strongly the photo shapes the pattern: 0 = free patterns, 1 = photo dominates).
The fold stack
- Add from the dropdown; it appends to the bottom.
- Reorder with ↑/↓ — order matters (Swirl-then-Mirror ≠ Mirror-then-Swirl).
- Remove with ×.
- Reset to defaults (button at the bottom of each fold) returns that fold’s parameters, origin and angle to their factory defaults — undoable.
- Numeric params are sliders; choice params are dropdowns (mode, style, symmetry group…).
- Mode-aware: multi-mode folds show only the current mode’s parameters.
- Origin (⊕): click it and drag on the canvas to place that fold’s center — great for off-center swirls and lenses.
Operator reference
All 127 folds, grouped by what they do. The big multi-mode banks are described below the tables.
Basic transforms
| Fold | What it does | Key params |
| Rotate | Spins coordinates | Angle° |
| Scale | Zooms coordinates | Factor |
| Shift | Translates the plane | X, Y |
| Shear | Slants the plane | X, Y |
| Mosaic | Snaps to a blocky grid | Cells |
Kaleidoscope & symmetry
| Fold | What it does | Key params |
| Polar fold | Wedge kaleidoscope — mirrors N slices | Segments, Offset° |
| Rosette Cn | Rotational (Cn) symmetry, no mirror — pinwheels | Segments, Offset° |
| Triangle fold | Triangular kaleidoscope | Scale |
| Mirror line | Reflect across a line | Angle°, Side |
| Mirror tile | Tiles X×Y with mirror/repeat | Tiles X/Y, Mode |
| Abs fold | Box fold — reflects past ±fold back inward | Fold |
| Brick | Brick-wall tiling, offset rows | Scale X, Scale Y |
| Bravais | Softly pulls points toward a lattice | Scale, Pull |
| Chainmail | Interlocking-ring tiling | Scale, Ring ratio |
| Hexagonal | Hex-cell tiling (cube-coordinate) | Scale |
| Honeycomb | Soft pull toward a hex lattice | Scale, Pull |
| Wallpaper | All 17 wallpaper groups | Group, Cell, Angle° |
| Frieze | The 7 frieze (strip) groups | Group, Angle°, Period |
| Hyperbolic | Hyperbolic {p,q} tiling (Poincaré disk) | p, q, Scale |
| Polyhedral | Spherical/polyhedral {p,q} symmetry | p, q, Scale |
| Aperiodic | Quasicrystal tilings (Penrose, Ammann) | Grids, Cell, Gamma, Mode, Levels, Inflation |
| Quasicrystal | 5-fold quasicrystal interference | Freq, Amp |
| Penrose fold | Golden-ratio Penrose lattice fold | Scale |
| Shape warp | Shape-boundary warp bank (below) | Shape, Warp mode, + |
| Tessellated | Grid/distort tiling bank (below) | Mode, Symmetry, Scale, + |
| Tri lattice | Triangular-lattice fold | Scale, Morph |
| Truchet2 | Truchet arc tiling | Exponents, Widths, Tiles, Seed |
| Weave | Over/under basket weave | Scale, Warp |
Swirls, spirals & waves
| Fold | What it does | Key params |
| Swirl | Whirlpool — rotation grows with radius | Amount |
| Spiral | Spiral distortion | Amount |
| Log spiral | Logarithmic spiral arms | Scale, Turn°, Arms, Mirror |
| Wave warp | Sine/triangle/saw/square displacement | Amp, Freq, Wave |
| Curl noise | Divergence-free swirl | Freq, Strength |
| Chladni | Standing-wave nodal warp | m, n, Amplitude |
| Fault | Hard shift across a line | Angle, Displacement |
| Jet stream | Horizontal gaussian shear jet | Speed, Width, Center |
| Karman vortex | Von Karman vortex street | Freq, Strength, Sep |
| PDJ | Four-sine PDJ warp (phase offsets) | a, b, c, d, e, f |
| Popcorn2 | Parametrized popcorn jitter | X, Y, C |
| Superposition | Two-frequency interference rings | Freq1, Freq2, Phase |
| Satin | Diagonal double-sine sheen | Freq, Sheen |
| Stwin | Twin-swirl distortion | Distort, Offsets |
| Screw | Radial screw / helix twist | Pitch |
| Maelstrom | Swirl-warped exponential spiral | Swirl, Freq, Scale |
| Oscilloscope | Mirror inside a cosine band | Separation, Frequency, Amplitude |
| Mitosis | Cell-division pinch/split | Separation, Width, Phase |
| Mushroom | Cap/stalk vertical profile | Cap radius, Cap width, Stalk |
| Wave bank | 17-style mega wave warper (below) | Style + per-style |
| Pleat | Folded-paper pleats | Angle°, Width, Tilt° |
| Petal | Flower-petal lobes | Lobes, Amp |
| Wedge | Angular pie-slice fan with swirl | Angle, Hole, Count, Swirl |
| Whorl | Inside/outside differential spiral | Inside, Outside |
| Tidal lock | Angular ratio spin + wobble | Ratio, Ecc |
| Wood grain | Concentric wood-ring displacement | Freq, Amp, Grain |
| Target | Log-ring alternating rotate | Even, Odd, Size |
| Target sp | Target with log-spiral tweak | Twist, N, Size, Tightness |
Lenses, rings & bubbles
| Fold | What it does | Key params |
| Spherical | Spherical inversion (1/r²) — fisheye bubble | Radius |
| Lens | Radial magnification | Curve |
| Ring fold | Folds into concentric rings | Density |
| Fresnel | Concentric Fresnel rings | Rings, Gain |
| Bubbles | Circle-packing bubbles | Scale, Floor, Iters |
| Circle mirror | Reflect across a circle (ball/window) | Radius, Mode |
| Radial pow | Raises radius to a power | Amount, Power |
| Gear teeth | Radial gear-tooth ripple | Teeth, Depth |
| Hammer | Hammer-Aitoff map projection | Scale |
| Mercator | Mercator map projection | Scale |
| Perspective | Apophysis perspective tilt | Angle, Dist |
| Stereographic plane | Stereographic plane projection | Scale |
| Supernova | Spinning ring-shell shockwave | Radius, Boost, Spin |
| Projective | Full 9-coefficient projective | A–C2 |
| Quadrupole | 4-pole cos(2θ)/r² field | Strength, Smooth |
| Rainbow arc | Bends radius bands into an arc | Radius, Width, Arc |
| Klein | Circle inversion inside a radius, twist | Inner radius, Twist |
| Membrane | Drumhead ring bulge | Radius, Height, Stiff |
| Moebius strip | Half-twist ring wrap | Radius |
| Ouroboros | Radius wraps into a twisting ring | Radius, Twist |
| Loonie | Circle-inversion bubbles (below) | Mode, Amount, + |
| Lens bank | Optical lens bank — 12 modes (below) | Mode + per-mode |
Conformal & complex maps
| Fold | What it does | Key params |
| Complex | 4-stage complex-function pipeline (below) | Stage 1–4, Freq, Reflect |
| Complex sum | 26-weight complex accumulator (below) | weights, affine, Reflect |
| Mobius | Simple Möbius transform | Offset X/Y, Rotate° |
| Mobius abcd | Full Möbius (az+b)/(cz+d) | Re/Im a,b,c,d |
| Foci | Hyperbolic foci warp | Amount |
| Murl | Murl / Murl2 curl-coil | Type, c, Power |
| Mcarpet | Magic-carpet twist/tilt warp | X, Y, Twist, Tilt |
| Mask | Complex sin/cosh mask warp | shifts, scales |
| Bipolar | Bipolar conformal map — lens/eye | Amount, Shift |
| Elliptic | Elliptic conformal map | Amount, Mode |
| Disc | Disc-family maps (disc, idisc, spiral, squircle…) | Mode, Amount, Twist, Petal |
| Zhukowski | Joukowski airfoil conformal map | c |
Fractal folds
| Fold | What it does | Key params |
| KIFS | Kaleidoscopic IFS fractal fold | Iters, Fold, Angle°, Scale |
| Multi-fold IFS | Multi-attractor KIFS — each step folds toward the nearest of N ring centres | Iters, Centres, Scale, Angle°, Radius, Fold, Offset°, Radius decay, Variation, Shear, Softness, Precession°, Pull |
| Koch fold | Koch-curve folding | Iters, Scale |
| DModulus | Double-modulus fractal tiling | Size X/Y, Angle°, Iters |
| Shatter | Tilted cells (shattered glass) | Cells, Tilt |
| Bedhead | Chaotic-attractor warp — organic, glitchy | a, b |
| Ikeda | Ikeda attractor — swirl-collapse chaos | u |
| Pickover | Pickover attractor — chaotic sine map | a, b, c, d |
| Svensson | Svensson attractor — sine/cos map | a, b, c, d |
| Symmetric icon | Symmetric-icon quadratic map | Lambda, Alpha, Beta, Omega |
| Kleinian | Kleinian-group inversion fractal | Circles, Radius, Iters, Scale, Bound, Spin°, Twist°, Frame |
| Fuchsian | Fuchsian group (hyperbolic tilings) | trace ta/tb/tab, Iters |
| Apollonian | Apollonian gasket circle packing | Iters, Radius, Scale |
| Inversive IFS | Chaos-game circle-inversion IFS — inverts through the nearest of N ring circles each step | Iters, Circles, Circle radius, Ring radius, Spin°, Offset°, Mode, Blend |
| Mandelbox fold | Box-fold + sphere-fold iteration — crunchy alien-machine structure | Iters, Scale, Min radius, Fixed radius, Fold limit, Blend |
| Power IFS | Conformal IFS — complex power about the nearest of N centres (curved spirals) | Iters, Centres, Power, Radius, Spin°, Offset°, Scale, Blend |
| Flame IFS | Apophysis-style IFS — 17 nonlinear variations about the nearest centre, + symmetry/precession | Iters, Centres, Variation (17 modes), Radius, Spin°, Offset°, Scale, Blend, Var amount, Precession°, Radius decay, Symmetry |
| Juliascope | Julia-set wedge mapping | Power, Dist, Wedge, Iters |
| Julian | Julia mapping | Power, Dist, Wedge |
| Worley | Worley / cellular (F1) noise fold | Scale, Jitter |
| Voronoi fold | Voronoi-cell fold toward nearest site | Scale, Fold |
Glitch folds
Digital-corruption folds — all keyed to the global Seed, so Reseed rerolls their block / tear patterns.
| Fold | What it does | Key params |
| Block displace | Quantizes into blocks and jumps each a hashed distance | Size, Shift, Density |
| Row tear | Offsets horizontal bands sideways (VHS tearing) | Bands, Shift, Density |
| Bit crush | Snaps coordinates to a coarse grid (chunky mosaic) | Levels, Mix |
| Shear cascade | Per-band horizontal shear that jumps at hashed steps | Steps, Shear |
| DCT ring | 8×8-style block quantize with a cosine wobble (JPEG ringing) | Size, Ring, Freq |
| Block shuffle | Snaps whole blocks to a different grid cell (tile-swap) | Size, Density, Spread |
Image-driven folds
These read the photo itself — sampling brightness, colour, or the local gradient and letting image content steer the warp. Order matters: placed after another fold, they read the already-folded image. No Seed dependence.
| Fold | What it does | Key params |
| Luma displace | Pushes coordinates along the image's own brightness (self-melt) | Push, Freq |
| Gradient displace | Pushes along the brightness gradient — relief or contour flow | Push, Detail, Mode |
| Refract | Brightness as a height field, refracted like wet glass | Index, Detail |
| Flow march | Marches along the image's flow for N steps — streamline smear | Steps, Step len, Detail |
| Edge shock | Displaces only where edges are strong; flat areas stay put | Push, Detail, Gate |
| Channel drive | Steers by a chosen channel (R/G/B) or hue instead of luma | Push, Channel, Freq |
| Value slide | Slides sample position by banded brightness — a pixel-sort cousin | Slide, Bands, Direction |
The big multi-mode banks
- Complex — up to four complex functions in sequence (1/z, z², sqrt, exp, log, the trig/hyperbolic families and their inverses), with per-axis frequency and optional mirror.
- Complex sum — instead of chaining, add functions with individual weights: a pre-conditioner tier (reciprocal, log, sqrt, exp) plus a 15-function sum tier, with an input affine.
- Wave bank — one fold, 17 wave styles (waves22, dc_gnarly’s 8 nested-trig modes, vibration2, waves2b Jacobi/Bessel, waves_julia/spiral/noise/mobius/power/fisheye/swirl…). Pick Style; only that style’s knobs show. Weight blends; Seed feeds input back.
- Lazy — the classic lazy-susan family: Susan (circular swirl, movable center via x/y), Travis (square swirl), Jess (n-gon swirl), plus a Sensen post-fold. For Travis/Jess try Amount ≈ 0.5–0.6 to stay in frame.
- Loonie — circle-inversion bubbles: Loonie (circle), Loonie2 (n-gon/star/circle blend), Loonie3 (parabolic). Radius sizes the bubble independently of Amount; Rotate spins the Loonie2 polygon.
- Lens bank — the optical zoo in one fold, 12 modes: Brown-Conrady, Mustache, Division, four Fisheye projections (stereographic/equisolid/equidistant/orthographic), Tangential, Petzval swirl, Panini, Anamorphic, Tilt-shift. Pick Mode; only that mode’s knobs show.
- Shape warp — a warp bank in one fold: pick a Shape (square, circle, diamond, triangle, pentagon, hexagon, flower, star, cloud…) whose boundary drives an inner→outer falloff, then a Warp mode (rotate, scale-radial, swirl, scale-XY, fisheye, shear). Shape-specific knobs appear only for the relevant shape.
- Tessellated — a tiling/distortion bank: pick a Mode (square power/sine/radial, hex offset, true hex, radial tiling, exp-log, tangent, polynomial, Julia) and a Symmetry (none, X/Y-reflect, quadrant, D4, Dn). Scale sets cell density, Edge blend softens seams, and Grid/Cell rotate with a Rotate pattern spin whole cells. Mode-specific knobs show only when relevant.
- BusyBrad — the grid version of the lazy family: tiles the plane (Grid size), each cell a Susan/Jess/Combined swirl, with Spin/Twist/Space/N and a Sensen fold. Grid size 0 = a single centered swirl.
Recolor
Counterchange is the one fold that changes color, not geometry: it splits the plane into stripes/checker/pinwheel/rings and recolors alternating regions (negate, hue 180°, desaturate, tint). Use Cell for scale, Angle° for orientation. (The Glass panel has a second, global counterchange.)
Glass — color & framing
- Frame / Frame width — border vignette-frame.
- Tint — color + blend amount.
- Counterchange (global) — off / negate / hue 180° / desaturate / tint, with a fold scale.
- Chroma — chromatic-aberration fringing. Ripple — final rippling pass. Vignette — darken edges. Grain — film grain. Hue / depth — shift hue with recursion depth.
- Post grade (every renderer): Exposure, Contrast, Saturation, Warmth, Posterize (0 = off), Scanlines (CRT sweep).
- Signal glitch: Channel split / Channel swap corrupt RGB, Block dropout punches holes, Dither crushes to a palette, Signal noise adds static, Interlace combs scanlines. Block patterns reroll with Reseed.
Motion — animation
- Drift slowly evolves fold parameters. Spin rotates the whole view. Rotate is a fixed (animatable) rotation. Wobble gently undulates the whole pattern over time — it animates every fold, plus the Wave folds and Ripple.
- Pulse breathes the zoom, Sway drifts the framing, Hue cycle rotates all colours over time.
- Motion glitch: Stutter quantizes the clock into hold-then-jump steps, Jitter shakes framing/rotation per frame, and Glitch burst spikes channel-split/noise/dropout on a beat (fires even with the glass-glitch sliders at 0).
- Loops are built to close seamlessly when exported as HQ Video.
Presets, export & recording
- Presets: load a factory recipe, save your own, Randomize, Reseed, and Copy/Paste or Import/Export as text to share.
- Export PNG at 1×/2×/4× the live view or a fixed height (1080p–2880p) — supersampled (2× SSAA) and downsampled for clean edges when it fits under the GPU limit; Feedback is rebuilt at export resolution.
- Record (WebM) captures the live canvas; HQ Video renders offline frame-by-frame (loops close exactly, Feedback rebuilt at full res).
- Aspect locks the composition to any common ratio before export.
Recipes to try
- Kaleidoscope portrait: Polar fold (6–12) → Swirl (small) → Panes + Tint.
- Infinite vortex: Spiral → Droste, raise Step scale & Twist.
- Stained glass: Wallpaper (p6m) → Counterchange (checker, tint) → Panes.
- Liquid chrome: Wave bank (dc_gnarly) → Feedback, add Chroma + a little Drift.
- Bubble field: Loonie (Loonie2, sides 6, some Star) → Spherical → Room.
- Spiral galaxy: Log spiral → Wave bank (waves_spiral) → Droste, Vignette up.
Muddy? Remove the last fold — over-stacking is the usual culprit. Flat? Switch the renderer before adding more folds.