
{
  "effects": [
    {
      "id": "synapse-demo-v0-1",
      "name": "SYNAPSE",
      "description": "Totem Pulse remix for the Synapse project with palette-shifted pulses instead of a gradient backdrop.",
      "tags": ["WebGL", "Shader", "Ambient"],
      "factory": "function createSynapseDemoEffect(canvas) { ... }",
      "shaderSnippet": "// totem pulse palette mix\nfloat beat = pow(1.0 - fract(uTime * 0.5), 3.0);\nvec3 wobble = mix(uColorA, uColorB, sin(uTime) * 0.5 + 0.5);\nvec3 flare = mix(wobble, uColorC, beat);\ngl_FragColor = vec4(wobble + flare * 0.35, 1.0);",
      "shaderLabel": "GLSL fragment",
      "duration": 120,
      "timelineEvents": []
    },
    {
      "id": "effect-starter-index-v0-3-1",
      "name": "PRIMER",
      "description": "Modular cyber tunnel reel with morphing totem, additive particles, and RGB-shift glitches.",
      "tags": ["WebGL", "Demoscene", "Glitch"],
      "factory": "function createEffectStarterIndexEffect(canvas) { ... }",
      "shaderSnippet": "// effect starter tunnel\nfloat gridX = step(0.95, fract(vUv.x * mix(14.0, 28.0, uMorph) + uTime * 0.2));\nfloat gridY = step(0.95, fract(vUv.y * mix(2.5, 6.0, uMorph)));\nvec3 baseColor = mix(uColor1, uColor2, sin(vUv.x * 3.14159 + uTime) * 0.5 + 0.5);\ngl_FragColor = vec4(baseColor * (gridX + gridY * 0.5), 1.0);",
      "shaderLabel": "GLSL fragment",
      "duration": 50,
      "timelineEvents": [
        {
          "time": 1.5,
          "type": "glitch",
          "duration": 0.35,
          "amount": 0.03
        },
        {
          "time": 7.5,
          "type": "glitch",
          "duration": 0.4,
          "amount": 0.035
        },
        {
          "time": 18.2,
          "type": "glitch",
          "duration": 0.45,
          "amount": 0.04
        }
      ]
    },
    {
      "id": "cyber-tunnel",
      "name": "TUNNEL",
      "description": "Warping grid tunnel with bloom, glitch hits, and a rotating totem lifted from the demoscene visualizer.",
      "tags": ["WebGL", "PostFX", "Procedural"],
      "factory": "function createCyberTunnelEffect(canvas, options = {}) { ... }",
      "shaderSnippet": "// tunnel fragment\nfloat gridX = step(0.95, fract(vUv.x * 20.0 + uTime * 0.2));\nfloat gridY = step(0.95, fract(vUv.y * 4.0));\nfloat lightPulse = sin(vUv.y * 20.0 - uTime * 5.0);\nvec3 baseColor = mix(uColor1, uColor2, sin(vUv.x * 3.14 + uTime));\ngl_FragColor = vec4(baseColor * (gridX + gridY * 0.5), fog);",
      "shaderLabel": "GLSL fragment",
      "duration": 120,
      "timelineEvents": []
    },
    {
      "id": "grid-tunnel-solo",
      "name": "GRID",
      "description": "Just the pulsing tunnel flow without the holographic totem for layering with other scenes.",
      "tags": ["WebGL", "PostFX", "Loop"],
      "factory": "function(canvas) { return createCyberTunnelEffect(canvas, { enableTotem: false }); }",
      "shaderSnippet": "// tunnel fragment\nfloat gridX = step(0.95, fract(vUv.x * 20.0 + uTime * 0.2));\nfloat gridY = step(0.95, fract(vUv.y * 4.0));\nfloat lightPulse = sin(vUv.y * 20.0 - uTime * 5.0);\nvec3 baseColor = mix(uColor1, uColor2, sin(vUv.x * 3.14 + uTime));\ngl_FragColor = vec4(baseColor * (gridX + gridY * 0.5), fog);",
      "shaderLabel": "GLSL fragment",
      "duration": 120,
      "timelineEvents": []
    },
    {
      "id": "totem-pulse",
      "name": "TOTEM",
      "description": "A standalone rotating totem with bloom-only highlights for lightweight overlays.",
      "tags": ["WebGL", "Minimal", "Bloom"],
      "factory": "function(canvas) { return createCyberTunnelEffect(canvas, { enableTunnel: false, enableGlitch: false }); }",
      "shaderSnippet": "// tunnel fragment\nfloat gridX = step(0.95, fract(vUv.x * 20.0 + uTime * 0.2));\nfloat gridY = step(0.95, fract(vUv.y * 4.0));\nfloat lightPulse = sin(vUv.y * 20.0 - uTime * 5.0);\nvec3 baseColor = mix(uColor1, uColor2, sin(vUv.x * 3.14 + uTime));\ngl_FragColor = vec4(baseColor * (gridX + gridY * 0.5), fog);",
      "shaderLabel": "GLSL fragment",
      "duration": 120,
      "timelineEvents": []
    },
    {
      "id": "cybernoid-deep-dive",
      "name": "CYBERNOID",
      "description": "Three morphing holograms pulse inside a warped tunnel with glitchable scrubbing and palette swaps.",
      "tags": ["WebGL", "Shaders", "Demoscene"],
      "factory": "function createCybernoidDeepDiveEffect(canvas, options = {}) { ... }",
      "shaderSnippet": "// hologram shell\nvec3 newPos = position + normal * (snoise(position * 0.1 + uTime * 0.5) * uDisplace * 5.0);\nfloat rim = pow(1.0 - abs(dot(vNormal, vec3(0.0, 0.0, 1.0))), 3.0);\nfloat grid = step(0.9, fract(vUv.x * 20.0)) + step(0.9, fract(vUv.y * 20.0));\nvec3 finalColor = uColor * (rim + grid * 0.5);\ngl_FragColor = vec4(finalColor, uOpacity * (0.3 + rim));",
      "shaderLabel": "GLSL fragment",
      "duration": 180,
      "timelineEvents": []
    },
    {
      "id": "cybernoid-warp-tunnel",
      "name": "WARP",
      "description": "The hypnotic CYBERNOID tunnel isolated for layering under other elements.",
      "tags": ["WebGL", "Shaders", "Loop"],
      "factory": "function(canvas) { return createCybernoidDeepDiveEffect(canvas, { showHolograms: false }); }",
      "shaderSnippet": "// hologram shell\nvec3 newPos = position + normal * (snoise(position * 0.1 + uTime * 0.5) * uDisplace * 5.0);\nfloat rim = pow(1.0 - abs(dot(vNormal, vec3(0.0, 0.0, 1.0))), 3.0);\nfloat grid = step(0.9, fract(vUv.x * 20.0)) + step(0.9, fract(vUv.y * 20.0));\nvec3 finalColor = uColor * (rim + grid * 0.5);\ngl_FragColor = vec4(finalColor, uOpacity * (0.3 + rim));",
      "shaderLabel": "GLSL fragment",
      "duration": 180,
      "timelineEvents": []
    },
    {
      "id": "hologram-trio",
      "name": "HOLOGRAM",
      "description": "The three morphing holograms without the tunnel shell for cleaner compositing.",
      "tags": ["WebGL", "Shaders", "Minimal"],
      "factory": "function(canvas) { return createCybernoidDeepDiveEffect(canvas, { showTunnel: false, enableGlitch: false }); }",
      "shaderSnippet": "// hologram shell\nvec3 newPos = position + normal * (snoise(position * 0.1 + uTime * 0.5) * uDisplace * 5.0);\nfloat rim = pow(1.0 - abs(dot(vNormal, vec3(0.0, 0.0, 1.0))), 3.0);\nfloat grid = step(0.9, fract(vUv.x * 20.0)) + step(0.9, fract(vUv.y * 20.0));\nvec3 finalColor = uColor * (rim + grid * 0.5);\ngl_FragColor = vec4(finalColor, uOpacity * (0.3 + rim));",
      "shaderLabel": "GLSL fragment",
      "duration": 180,
      "timelineEvents": []
    },
    {
      "id": "prismatic-nebula",
      "name": "NEBULA",
      "description": "Shifting shards and stardust swirling through a kaleidoscopic nebula.",
      "tags": ["WebGL", "Particles", "Bloom"],
      "factory": "function createPrismaticNebulaEffect(canvas, options = {}) { ... }",
      "shaderSnippet": "// prismatic tunnel fog\nfloat gridX = step(0.98, fract(vUv.x * 28.0 + uTime * 0.1));\nfloat gridY = step(0.98, fract(vUv.y * 6.0));\nvec3 base = mix(uColor1, uColor2, sin(vUv.x * 3.1415 + uTime));\nvec3 finalColor = base * (gridX + gridY * 0.8);\ngl_FragColor = vec4(finalColor, fog);",
      "shaderLabel": "GLSL fragment",
      "duration": 150,
      "timelineEvents": []
    },
    {
      "id": "stardust-drift",
      "name": "STARDUST",
      "description": "The sparkling Prismatic starfield on its own as a gentle looping background.",
      "tags": ["WebGL", "Particles", "Loop"],
      "factory": "function(canvas) { return createPrismaticNebulaEffect(canvas, { showShards: false }); }",
      "shaderSnippet": "// prismatic tunnel fog\nfloat gridX = step(0.98, fract(vUv.x * 28.0 + uTime * 0.1));\nfloat gridY = step(0.98, fract(vUv.y * 6.0));\nvec3 base = mix(uColor1, uColor2, sin(vUv.x * 3.1415 + uTime));\nvec3 finalColor = base * (gridX + gridY * 0.8);\ngl_FragColor = vec4(finalColor, fog);",
      "shaderLabel": "GLSL fragment",
      "duration": 150,
      "timelineEvents": []
    },
    {
      "id": "crystal-bloom",
      "name": "CRYSTAL",
      "description": "Floating crystalline shards with rim lighting and palette shifts, without the surrounding dust.",
      "tags": ["WebGL", "Bloom", "Minimal"],
      "factory": "function(canvas) { return createPrismaticNebulaEffect(canvas, { showStars: false }); }",
      "shaderSnippet": "// prismatic tunnel fog\nfloat gridX = step(0.98, fract(vUv.x * 28.0 + uTime * 0.1));\nfloat gridY = step(0.98, fract(vUv.y * 6.0));\nvec3 base = mix(uColor1, uColor2, sin(vUv.x * 3.1415 + uTime));\nvec3 finalColor = base * (gridX + gridY * 0.8);\ngl_FragColor = vec4(finalColor, fog);",
      "shaderLabel": "GLSL fragment",
      "duration": 150,
      "timelineEvents": []
    },
    {
      "id": "morphing-showcase",
      "name": "MORPH",
      "description": "A mega-mix reel that stitches all the previous elements together with dramatic zooms and morphs.",
      "tags": ["WebGL", "Cinematic", "Blend"],
      "factory": "function createMorphingShowcaseEffect(canvas, options = {}) { ... }",
      "shaderSnippet": "// morphing tunnel shell\nfloat gridX = step(0.98, fract(vUv.x * 28.0 + uTime * 0.1));\nfloat gridY = step(0.98, fract(vUv.y * 6.0));\nvec3 base = mix(uColor1, uColor2, sin(vUv.x * 3.1415 + uTime));\nvec3 finalColor = base * (gridX + gridY * 0.8) + base * sin(vUv.y * 18.0 - uTime * 7.0) * 0.4;\ngl_FragColor = vec4(finalColor, fog);",
      "shaderLabel": "GLSL fragment",
      "duration": 48,
      "timelineEvents": []
    },
    {
      "id": "morph-focus-torus",
      "name": "TORUS",
      "description": "The twisting torus knot hologram isolated inside the morphing tunnel with stars.",
      "tags": ["WebGL", "Hologram", "Solo"],
      "factory": "function(canvas) { return createMorphingShowcaseEffect(canvas, { soloShapeIndex: 0 }); }",
      "shaderSnippet": "// morphing tunnel shell\nfloat gridX = step(0.98, fract(vUv.x * 28.0 + uTime * 0.1));\nfloat gridY = step(0.98, fract(vUv.y * 6.0));\nvec3 base = mix(uColor1, uColor2, sin(vUv.x * 3.1415 + uTime));\nvec3 finalColor = base * (gridX + gridY * 0.8) + base * sin(vUv.y * 18.0 - uTime * 7.0) * 0.4;\ngl_FragColor = vec4(finalColor, fog);",
      "shaderLabel": "GLSL fragment",
      "duration": 48,
      "timelineEvents": []
    },
    {
      "id": "morph-focus-icosahedron",
      "name": "ICOSA",
      "description": "An icosahedron prism glows on its own with the cinematic tunnel backdrop.",
      "tags": ["WebGL", "Hologram", "Solo"],
      "factory": "function(canvas) { return createMorphingShowcaseEffect(canvas, { soloShapeIndex: 1 }); }",
      "shaderSnippet": "// morphing tunnel shell\nfloat gridX = step(0.98, fract(vUv.x * 28.0 + uTime * 0.1));\nfloat gridY = step(0.98, fract(vUv.y * 6.0));\nvec3 base = mix(uColor1, uColor2, sin(vUv.x * 3.1415 + uTime));\nvec3 finalColor = base * (gridX + gridY * 0.8) + base * sin(vUv.y * 18.0 - uTime * 7.0) * 0.4;\ngl_FragColor = vec4(finalColor, fog);",
      "shaderLabel": "GLSL fragment",
      "duration": 48,
      "timelineEvents": []
    },
    {
      "id": "morph-focus-cube",
      "name": "CUBE",
      "description": "The subdivided cube hologram spinning in place without the other morphing shapes.",
      "tags": ["WebGL", "Hologram", "Solo"],
      "factory": "function(canvas) { return createMorphingShowcaseEffect(canvas, { soloShapeIndex: 2 }); }",
      "shaderSnippet": "// morphing tunnel shell\nfloat gridX = step(0.98, fract(vUv.x * 28.0 + uTime * 0.1));\nfloat gridY = step(0.98, fract(vUv.y * 6.0));\nvec3 base = mix(uColor1, uColor2, sin(vUv.x * 3.1415 + uTime));\nvec3 finalColor = base * (gridX + gridY * 0.8) + base * sin(vUv.y * 18.0 - uTime * 7.0) * 0.4;\ngl_FragColor = vec4(finalColor, fog);",
      "shaderLabel": "GLSL fragment",
      "duration": 48,
      "timelineEvents": []
    },
    {
      "id": "morph-focus-octahedron",
      "name": "OCTA",
      "description": "A crystalline octahedron focal point with the morph tunnel and starfield.",
      "tags": ["WebGL", "Hologram", "Solo"],
      "factory": "function(canvas) { return createMorphingShowcaseEffect(canvas, { soloShapeIndex: 3 }); }",
      "shaderSnippet": "// morphing tunnel shell\nfloat gridX = step(0.98, fract(vUv.x * 28.0 + uTime * 0.1));\nfloat gridY = step(0.98, fract(vUv.y * 6.0));\nvec3 base = mix(uColor1, uColor2, sin(vUv.x * 3.1415 + uTime));\nvec3 finalColor = base * (gridX + gridY * 0.8) + base * sin(vUv.y * 18.0 - uTime * 7.0) * 0.4;\ngl_FragColor = vec4(finalColor, fog);",
      "shaderLabel": "GLSL fragment",
      "duration": 48,
      "timelineEvents": []
    },
    {
      "id": "neon-genesis-core",
      "name": "NEON",
      "description": "A condensed demoscene featuring the neon core, particles, rings, bloom, and glitch hits.",
      "tags": ["WebGL", "Bloom", "Demoscene"],
      "factory": "function createNeonGenesisEffect(canvas) { ... }",
      "shaderSnippet": "// neon core bloom\nvec3 colorA = vec3(0.0, 0.95, 1.0);\nvec3 colorB = vec3(1.0, 0.0, 1.0);\nfloat mixVal = smoothstep(-0.2, 0.5, vDisplacement);\nfloat scan = sin(vUv.y * 120.0 + uTime * 6.0) * 0.08;\ngl_FragColor = vec4(mix(colorA, colorB, mixVal) + scan, 1.0);",
      "shaderLabel": "GLSL fragment",
      "duration": 64,
      "timelineEvents": []
    },
    {
      "id": "synapse-genesis",
      "name": "HYPERSTATE",
      "description": "Kinetic style-hopping demoscene with kanji bursts, bloom pulses, and glitch hits.",
      "tags": ["WebGL", "Demoscene", "Glitch"],
      "factory": "function createSynapseGenesisEffect(canvas, options = {}) { ... }",
      "shaderSnippet": "// synapse scanlines\nfloat pulse = smoothstep(0.0, 1.0, abs(vN));\ngl_FragColor = vec4(uColor * (pulse + 0.35), 1.0);",
      "shaderLabel": "GLSL fragment",
      "duration": 180,
      "timelineEvents": []
    },
    {
      "id": "synapse-signal-drift",
      "name": "DRIFT",
      "description": "A lighter Synapse mix with particles and morph core focus, without glitch spikes.",
      "tags": ["WebGL", "Loop", "Minimal"],
      "factory": "function(canvas) { return createSynapseGenesisEffect(canvas, { enableGlitch: false, particleCount: 8000 }); }",
      "shaderSnippet": "// synapse scanlines\nfloat pulse = smoothstep(0.0, 1.0, abs(vN));\ngl_FragColor = vec4(uColor * (pulse + 0.35), 1.0);",
      "shaderLabel": "GLSL fragment",
      "duration": 180,
      "timelineEvents": []
    },
    {
      "id": "ember-ritual",
      "name": "EMBER RITUAL",
      "description": "A WebGL shader vignette inspired by the supplied album art: teal smoke rising from a molten-orange ritual circle.",
      "tags": ["WebGL", "Shader", "Vignette"],
      "factory": "function createEmberRitualEffect(canvas) { ... }",
      "shaderSnippet": "// ember ritual smoke\nfloat g = exp(-length(vUv - 0.5) * 6.0);\nvec3 ember = mix(vec3(0.07, 0.2, 0.18), vec3(1.0, 0.6, 0.18), smoothstep(0.6, 0.2, vUv.y));\nvec3 plume = vec3(0.2, 0.85, 1.0) * g;\ngl_FragColor = vec4(ember + plume, 1.0);",
      "shaderLabel": "GLSL fragment",
      "duration": 160,
      "timelineEvents": []
    },
    {
      "id": "synapse-demo-v0-1",
      "name": "SYNAPSE DEMO v0.1",
      "description": "Updated to mirror the \"Totem Pulse\" look so the Synapse project isn't just a gradient backdrop.",
      "tags": ["WebGL", "Totem", "Pulse"],
      "factory": "function createSynapseDemoEffect(canvas) { ... }",
      "shaderSnippet": "// totem pulse palette mix\nfloat beat = pow(1.0 - fract(uTime * 0.5), 3.0);\nvec3 wobble = mix(uColorA, uColorB, sin(uTime) * 0.5 + 0.5);\nvec3 flare = mix(wobble, uColorC, beat);\ngl_FragColor = vec4(wobble + flare * 0.35, 1.0);",
      "shaderLabel": "GLSL fragment",
      "duration": 120,
      "timelineEvents": []
    }
  ]
}
