Iguana icon
IGUANAaudio · feedback · shaders

iguana.

it really licks the eyeball
▼ DOWNLOAD FREE · 38 MB

get iguana

standalone build · no installer · open source code.

windows macos linux build from src
‹ / › SOURCE github

view on github

gdscript + gdshader. star it, fork it, write a shader.

issues discussions releases wiki
01

watch it wiggle

[ demo video ]
live · iguana winamp · milkdrop
02

screenshot gallery

[ screens ]
03

features & guts

[ pgdn for more ]

real-time fft

AudioEffectSpectrumAnalyzer feeds 30+ uniforms — frequency bands, transients, spectral mood descriptors — into the shader every frame.

~30 uniforms · per-frame

feedback pipeline

two-viewport ping-pong. the shader samples its previous frame, accumulating visual history the milkdrop way.

subviewport · ping-pong

auto-discovered shaders

drop a .gdshader into res://shaders/ with valid @meta tags. it appears in the picker.

hot · zero config

swappable skins

theme + style + icons in self-contained folders. ships with aero, iguana, kitty. mix & match at runtime — no restart.

3 skins included

keyboard shortcuts

keymap.gd covers every action. play/pause, next shader, fullscreen, volume, mute — all on single keys.

14 shortcuts

post-process, outside

tonemap, gamma, vignette, grain run on a layer above the feedback loop so they don't compound or trail.

no smear · no haze
04

the pipeline

[ engine/visualizer.gd ]
  AudioEffectSpectrumAnalyzer
              │
              ▼
  AudioAnalyzer.process()           // runs every frame via AudioSource
              │
              ▼
  _push_uniforms()                  // 30+ values → active ShaderMaterial
              │
              ▼
  FeedbackViewport  (SubViewport)   // shader renders here
              │
              ▼
  BackbufferViewport (SubViewport)  // copies feedback output each frame
              │
              ▼
  prev_frame uniform                // shader reads completed last frame
              │
              ▼
  PostProcessDisplay (ColorRect)    // tonemap · gamma · vignette · grain

  // a shader cannot sample its own render target —
  // two viewports give us a real, completed previous frame to read from.
05

roll your own

[ docs/ ]
SHADER.md — adding a visualizer [ ─ □ × ]

1. start from the template

copy shaders/utils/shader_template.gdshader and rename it. drop your file into res://shaders/ (flat, no subfolders).

2. tag it

@name         supersaw drift
@author       you@here
@description  one line

3. read the uniforms

uniform sampler2D prev_frame;
uniform float time_val, beat;
uniform float bass, mid, treble;
uniform float energy, onset, kick;
APPEARANCE.md — adding a skin [ ─ □ × ]

folder layout

ui/appearance/your_skin/
theme.tres       // colors
style.tres       // glass shader params
style.gdshader   // ui overlay
Geist.ttf        // optional font
icons/*.svg      // icon set

mix & match

users can run your theme with someone else's icons. all three pieces are independent — keep them honest.

live swap

no restart needed. change skin in Settings and every panel, button, and icon reloads instantly in place.

06

made by

[ one human · zero vc ]
magooney avatar

magooney-loon

@MyMoonEnt

just an aesthetics europemaxxer hobbyist internet nobody. iguana started as a #OSSvibejam weekend port of winamp/milkdrop and grew into whatever this is. built in godot because it's my first godot app and GDShaders are kewl.