Defiant GLSL Studio ProManual ← Studio home

Defiant GLSL Studio Pro

Every word, tab, slider and panel in the studio, what it does, and how the shows stitch shaders together. Nothing here needs to be memorised — the Help word in the strip opens this page whenever you need it.

1Start here

The studio is one page that plays the shaders in the GLSL/ folder next to it. It renders with WebGL2, grades the picture in float, and can layer a kaleidoscope, a colour-key mask, a particle field, a text playlist and an image over the shader before the final grade. Everything ships inside this folder: no Python, no Node, no network at run time.

Three ways to open it

Served — the site

Open /studio.html on the site. The folder is read live from GLSL/ through GLSL/manifest.php, and Upload, New folder, Rename, Move, Delete, Save show and the bundle rebuild all write to disk. This is how the subdomain runs it.

Served — the launcher

startmac.sh, startlinux.sh or startwin.bat starts the static server that ships in bin/server/ and opens studio.html. Same live folder, no PHP needed.

Direct — file://

Double-click studio.html. The files come from bin/glsl-bundle.js instead of the folder, so every shader still appears and the folders can still be browsed. Anything that has to write to disk asks for the launcher; the status line says so.

All three run the same page; the difference is only where the shader list and file writes come from. A browser with WebGL2 (current Chrome, Edge, Firefox or Safari) is the one hard requirement. A trial runs for 30 minutes and the strip counts it down; a licence replaces the count with the plan.

2The screen

The window is three columns under one strip. The strip holds the words, the tree sits on the left, the picture takes the middle, and the right quarter is one of three tabs. Columns only ever take a quarter each, so the viewer is always the largest thing on screen.

The whole studio: the strip with the name and its words, the file tree on the left, the show words and buttons above the picture, and the Inputs tab on the right
The whole window in one frame: the strip, the tree in PLASMAS, the show words and six show buttons, the picture, and the Inputs tab with its status line.
AreaWhat lives there
StripThe name on the left with a small badge (trial time or plan), then five words — Present, Files, Shows, Light, Help — and, against the right edge, the three tabs: Inputs, Effects, Text.
File tree leftA browser over GLSL/ itself: folder chips, the shaders of the folder you are in, one per line, with the row's tools where you point at them. Opened by the Files word.
Show row top middleSix words — Record, Save show, Load show, Play show, Clear show, Send — over the saved shows, which are buttons with a name, a 3-character tag box and a ×. Folded by the Shows word.
Stage middleThe rendered shader, with the text and image overlays on top. It takes every pixel the columns are not using, with no border and no gap.
Right quarter rightOne tab at a time: Inputs (speed, fps, media routing, grade, tone, status line), Effects (kaleidoscope, mask, particles, post) or Text (overlay, playlist, image).
The three tabs never share the quarter. Picking one closes the others, and Inputs clicked while it is already open closes the column so the picture gets the whole width back.

3The strip

The strip is a menu of words, not a wall of buttons: they sit quietly on the bar and only the one that is switched on keeps a fill. Left to right:

The strip: the studio name and the trial badge on the left, then Present, Files, Shows, Light and Help, with the Inputs, Effects and Text tabs against the right edge
The strip — the four-colour GLSL in the name, the trial badge beside it, the five words in the middle and the three panel tabs on the right.
  • Badge — trial minutes left, or your plan when a licence is signed in. When the time runs out the studio locks and the badge turns red.
  • Present — the picture alone, full screen. Esc comes back.
  • Files — opens and closes the file tree on the left.
  • Shows — folds the show words and the saved shows away, and brings them back.
  • Light — the theme switch; the label names the theme you are in. The choice is remembered for the next session.
  • Help — opens this manual in a new tab.
  • Inputs / Effects / Text — the right quarter. On the tab that is showing, off on the others.
WordWhat it does
PresentHides the strip, the tree, the show row and the right quarter, and puts the picture full screen. Esc or the same key comes back.
FilesOpens the tree on the left. The viewer grows into the space the column gives up, and a second click hands the space back.
ShowsFolds the show words and the saved shows. The strip itself stays, so this word is how you bring them back.
LightSwitches the whole studio between the dark and the light theme, down to the panels and the dialogs.
HelpOpens this manual. It works in both the served and the file:// way of running the studio.
InputsOpens the right column: transport, media routing, grade, tone and the status line. See section 7.
EffectsSwaps the column for the effects panel — see section 8. The stage resizes to sit beside it; the panel never covers the picture.
TextSwaps the column for the text and image panel — see section 9.

4Files & folders

The left column is the folder itself, not a filter. It browses GLSL/ the way a file manager does: folder chips across the top, the shaders of the folder you are in underneath, and every action — create, upload, rename, move, edit, delete — carried out on the real folder through the site.

The file tree: folder chips at the top, a select-all bar, then one shader per line with a dialect dot and a name, and the file words at the foot
The tree in PLASMAS: 81 shaders, the dialect dot in front of every name, the count at the foot and the file words under it.
  • Folder chips — one per real subfolder of GLSL/. Click to go in, click the lit one again to come back out to everything.
  • Select all / Unselect all — the bar under the chips ticks every shader the list is showing, or clears the ticks again; the count between them says how many are ticked.
  • A row — the dialect dot and the name. Click the name to load and play it.
  • Row tools — appear on the row you point at or the one that is loaded: the 3-character tag box, the tick, edit source, move, add to show, delete.
  • Count — how many shaders are in the folder you are browsing.
  • find a shader… — narrows the list as you type.
  • Upload, + Folder, − Folder, Rebuild bundle — the words at the foot of the column, because each one changes what the column is showing.
Served, this is the folder on disk. When the studio is open from disk instead, the same files are read from bin/glsl-bundle.js and the actions that would write are disabled, because there is no server to write through. The column looks and browses the same either way.

Folders

  • Each chip is a real subfolder of GLSL/. The studio's own storage folders (json/, TEXTURE/, VIDEO/, shows/ and the like) are kept out of that row, so it only lists places you would put shaders.
  • Click a chip to go into it: the list then shows that folder's files only, and the status line reads folder name. Click it again to come back out to everything, with all shaders in the status line.
  • + Folder creates a real folder under GLSL/ and it appears in the row straight away. − Folder removes the folder you are browsing, and only while it is empty.
  • Right-click a chip for Rename folder… — which carries every file inside it to the new name — and Remove chip, which removes only the shortcut: the folder and its files stay on disk.
  • Folders added outside the studio (Finder, Explorer, a git pull) show up when the window regains focus, so a reload is not needed.

The row and its tools

PartWhat it does
DotThe dialect that was detected — see the table below. It is the first thing on every line.
NameClick to load and play the shader. The file's extension is not drawn, so the name reads as the shader's name.
Tag boxThree characters per shader, saved in the browser. If they form a number, that number is how many seconds the button plays inside a show; any other text is just a label and the show uses the 10-second default. The tag travels with a button when it is copied into a show.
TickMarks the file, so Move… takes every ticked file together. Tick state is stored in the browser, not in the file.
EditOpens the file in the built-in editor, with Save writing it back and recompiling.
MoveLists the subfolders of GLSL/ (plus the top level) so the file — or every ticked file — can go to another folder.
Add to showCopies the shader onto the end of the current show as a new button, keeping its tag.
DeleteAsks first, then deletes the file.

Dot colours (dialect)

GreenShadertoy — the file has a mainImage(); it gets iTime, iResolution, iMouse, iChannel0-3 and the rest.
PurpleClassic — an ordinary void main() fragment shader.
AmberCRT — a libretro-style shader (#pragma parameter, COMPAT_TEXTURE, ruby texture calls).
BlueAudio — the file declares mainSound().
GreyText or empty — nothing shader-shaped was recognised, or the file is blank.

5Shows

A show is a line-up of shaders with their own settings. Each show button is a full copy of a file's settings — its own name, its own tag, and its own copy of every slider — so a shader can appear twice in one show looking completely different.

The show row: Record, Save show, Load show, Play show, Clear show and Send as plain words above a row of show buttons, each with a name, a tag box and a close cross
The show row: six words and nothing boxed until one is switched on, over the saved shows.
  • Record — writes the player or the output window to a video file.
  • Save show — stores the line-up, with every button's settings, under a name you type.
  • Load show — replaces the current line-up with one saved in GLSL/shows/.
  • Play show — plays from the first button and stays filled while it runs; pressing it again is the stop.
  • Clear show — empties the line-up. The saved copies are untouched.
  • Send — pushes the shader in the viewer to the output window, opening that window if it is not already up.
  • Show buttons — a name, a tag box with the seconds it runs for, and a × that takes it out of the show.

The show words

WordWhat it does
RecordOpens the Record dialog: pick WebM or MP4, then record this window's player or the output window. Pressing it again stops and keeps the file. See section 10.
Save showWrites the whole line-up — order, names, tags and every setting of every button — under a name you type. Typing a name that already exists replaces that show; the dialog marks the existing entry so you can see it will be overwritten.
Load showLists the shows saved in GLSL/shows/; picking one replaces the current line-up with it.
Play showPlays the line-up from the first button. It is also the stop, and it is the one word that keeps a fill while a show runs.
Clear showRemoves every button from the line-up without touching the shaders or the saved shows.
SendSends the shader in the viewer to the output window — opening that window first if it is not up. Use it while building a show, or to mirror one shader onto a second screen. While a show runs, every step is sent there too.

How playback works

  • Each button runs for the seconds in its tag box, or 10 seconds when the box holds nothing numeric. The status line shows show 3/6 · name · 8s while it runs.
  • The line-up loops: after the last button it starts again at the first, until you stop it.
  • Every step loads the shader and that button's saved settings, then starts playing it, so two buttons pointing at the same file can look nothing alike.
  • On the first press the output window is opened for you if it is not already up, and every step is sent to it, so the second screen follows the show button by button.
  • Play show lights up while a show runs. Stopping leaves the current shader loaded but paused.
  • Adding or removing buttons while a show plays does not disturb it — the next step simply uses the new line-up.

Show buttons

  • Each button has its own tag box: type 12 and that button runs twelve seconds.
  • The small × on the right of a button takes it out of the show. The shader itself is untouched.
  • Editing any slider while a show button is selected changes only that button: the settings are stored per button, not per file.
  • The row of shows scrolls inside its own band, so forty shows do not push the picture off the screen.
Send in this row is the manual version of what a show does automatically: it pushes the current shader to the output window without starting a show.

6Viewer & player menu

The viewer takes every pixel the columns are not using, in both directions. The frame keeps its 16:9 shape inside that space, so a tall or narrow window letterboxes rather than stretching the picture.

The player menu: Edit shader, Detach mouse, Clone, then 1080p, 720p and 480p with a tick beside the one in use
The player menu, opened by right-clicking the picture.
  • Edit shader — opens the source of whatever is running, in the built-in editor.
  • Detach mouse — lets the pointer reach the page when a shader grabs it; right-click again to reattach.
  • Clone — opens the output window that frames the slave player.
  • 1080p / 720p / 480p — the resolution the picture is rendered at; the one in use has a tick, and lower is cheaper.

Right-click the picture

Edit shaderThe same editor as Edit on a row: Save writes the file and recompiles, Cancel throws the edit away.
Detach mouseLets the pointer pass through to the page so the menu is reachable when a shader grabs the mouse.
CloneOpens the output window — a small 16:9 window that frames slave.html, showing only the player surface. Drag it to another display and the studio keeps controlling it.
1080p / 720p / 480pSets the render size of the picture: the shader is drawn at that resolution and scaled into the window.

In the viewer

  • Double-click the picture to go full screen; double-click or Esc to come back.
  • Drop shader files onto the window to load them (a dashed target appears while you drag).
  • Shift-scroll over the canvas nudges exposure, the same control as in Inputs → Grade.
  • If a shader fails to compile, an error panel rises from the bottom with the compiler log; the previous shader keeps running underneath.
  • S shows and hides the source panel under the picture, so you can read the running shader without opening the editor.

7Inputs tab

Transport, media routing, grade and tone over a status line. Everything here is saved per shader, so each shader comes back with the speed, media routing and grade you gave it.

The Inputs tab: speed and fps, the Input block with its routing rows, Grade, Tone and the status line
The Inputs tab from top to bottom: speed and fps, Input, Grade, Tone, and the status line along its foot.
  • Speed — playback rate; the centre freezes, negative runs backwards.
  • Fps — how often the shader is drawn: 120, 60, 30 or 15.
  • Audio / Url / Texture / Video — where the channels get their picture and sound from.
  • Input — which capture feeds the audio texture; stream url adds an internet radio stream.
  • Gain — amplification into the texture only, never the sound card output.
  • Level — the incoming signal as a bar that turns amber near clipping.
  • Audio 0 1 2 3, Texture 0 1 2 3, Video 0 1 2 3 — which Shadertoy channels each source is routed to; the lit number is the channel it feeds.
  • Flip X, Flip Y, Repeat, Clamp — mirrors the media, tiles it, or clamps it at the edges.
  • Size X / Size Y and Pos X / Pos Y — forces a pixel size (Auto keeps the media's own) and slides it inside its frame (double-click the dot for Center).
  • Rotate Input with Spin — turns the media, or keeps it turning.
  • Exposure, Vibrance — the grade, applied in float before tone mapping.
  • Raw, Auto, Filmic — the tone of the picture; Raw shows exactly what the shader computes.
  • Status line — folder, dialect, time, fps, buffer size, and the key hints.

Transport

SpeedPlayback rate from -800% to +800%; the centre is a freeze frame, positive runs forward, negative runs the shader backwards. The value beside it reads the multiplier.
FpsHow often the picture is drawn — 120, 60, 30 or 15 frames a second. The clock keeps its own speed, so a lower rate only makes the motion choppier.

Input

AudioCaptures sound into an audio texture. The browser asks what to share — pick a screen or tab and tick Share system audio, or use a loopback device. The Level bar shows what is arriving.
UrlSets an internet radio stream as the audio source; it belongs to the studio, so it survives a shader change.
TexturePicks an image from GLSL/TEXTURE/ and feeds it to whichever channels are on.
VideoThe same for a clip from GLSL/VIDEO/, playing live into the channels.
InputWhich capture feeds the audio texture: a loopback device, a microphone, or stream url.
GainAmplification on the way into the texture only. It never changes the sound card's output or what you hear.
LevelThe incoming signal, drawn as a bar that turns amber near clipping, with a word for the state beside it.
Audio / Texture / Video rowsFour buttons each, 0 to 3: the Shadertoy channels that source is routed to. A shader that samples iChannel1 wants 1 lit in the row that is feeding it.
Flip X / Flip YMirrors the fed texture or video.
Repeat / ClampTiles the media when a shader samples outside 0–1, or pins it to the edge.
Size X / Size YForces the fed media to a pixel size; Auto keeps its own, and the word beside the slider says so.
Pos X / Pos YSlides the media inside its frame. Center beside the slider is its reset.
Rotate Input / SpinTurns the fed media about its centre; Spin makes it turn continuously, with the slider then setting the speed.

Grade

ExposureLinear exposure applied before tone mapping. Shift-scroll on the canvas does the same thing.
VibranceChroma gain around a fixed luminance, so colour rises without washing the picture out.

Tone

RawOn by default: shows exactly what the shader computes — no grade, no auto-exposure, no offscreen pass. The note under the row says so.
AutoMeters each frame and adjusts exposure automatically. Ignored while Raw is on.
FilmicRolls the highlights off instead of clipping them hard.

Status line

folderThe folder you are browsing in the tree.
dialectHow the running file was classified (shadertoy, classic, crt, audio, text).
timeSeconds since the shader started, reset by R.
fpsMeasured frame rate.
bufferThe size the shader is actually rendered at.
hintsspace play · ← → browse · r reset.

8Effects tab

Four blocks that run after the shader and before the final grade, so they treat the picture rather than the code. While this panel is out its quarter is reserved and the viewer resizes to sit beside it — the panel never covers the picture. Every control is saved per shader.

Top of the Effects tab: Kaleidoscope with segments, rotate, spin and zoom, then Mask with its buttons and sliders, then the head of Particles
The panel from the top: Kaleidoscope with its zoom, then the Mask block with every slider, then the head of Particles.
  • Kaleidoscope — switches the fold on and off; beside it the value reads off or the segment count.
  • Segments — 2–16 mirrored wedges.
  • Rotate — turns the fold; Spin turns it continuously and the slider becomes the speed.
  • Zoom — the size of the fold inside the frame.
  • Mask — switches the colour-key mask on and off.
  • Foreground — paints the keyed colour or everything else.
  • Add / Sub / Int / Diff — how the mask combines with the picture.
  • Src: Key — what builds the matte: keyed colour, alpha or luma.
  • Colour — the mask lays down the mask colour or the layer's own pixels.
  • Colour swatch — the colour that is keyed out and painted.
  • Matte — shows the matte in black and white for judging tolerance.
  • Texture / Video / Clear — the layer the mask keys from, and the way to drop it.
  • Tolerance … Layer X / Y — the sliders in the table below.
  • Particles — the sprite field, its presets and two emitters.
  • Post — Bloom, Vignette, Scanlines and Grain.
Lower part of the Effects tab: the particle presets, the two emitters with every slider, then the Post block
Lower down the same panel: the particles with both emitters and every slider, then Post.

Kaleidoscope

KaleidoscopeSwitches the fold on and off; the value beside it says off or the segment count.
Segments2–16 mirrored wedges around the centre. Two is a simple mirror, higher numbers make a flower.
RotateTurns the fold about the centre. Spin makes it turn continuously, with the slider then setting the speed; its centre stops it.
Zoom50–300% — how much of the fold fills the frame.

Mask

A colour-key mask, in the spirit of a broadcast keyer: it takes a colour out of a layer and lays the mask over the frame.

MaskSwitches the mask on and off.
ForegroundChooses which side is painted: the keyed colour itself (foreground) or everything else.
Add / Sub / Int / DiffHow the mask combines with the picture. Add paints the mask colour inside the mask, Sub covers the inside, Int keeps only the inside, Diff flips the frame inside it.
Src: KeyCycles what the matte is built from: the keyed colour, the layer's alpha, or its brightness.
ColourWhat the mask lays down inside itself: the mask colour, or the picked layer's own pixels.
Colour swatchThe colour that is keyed out of the layer and painted by the mask.
MatteShows the matte itself in black and white, which is how you judge tolerance.
Texture / VideoPicks the image or clip the mask keys from.
ClearDrops the picked layer, leaving the mask unkeyed.
ToleranceHow far from the key colour still counts as part of the mask.
FeatherThe width of the edge ramp.
ExpandGrows or shrinks the mask without moving its centre.
MixHow much of the mask colour replaces the frame inside the mask.
AmountStrength of the whole mask.
DespillPulls the key colour's cast out of the frame.
BlurPre-blurs the layer before keying, so grain in a video matte does not chew holes in it.
BalanceDespill compares against the brightest channel (0%) or the average of all three (100%).
Clip Black / Clip WhiteTightens and hardens the matte: values below the first become transparent, values above the second become solid.
Frame Zoom / Frame RotMoves and turns the shader frame the mask is laid over.
Layer Zoom / Layer RotMoves and turns the picked layer before it is keyed.
Layer X / Layer YSlides the picked layer across and up the frame.

Particles

ParticlesSwitches the sprite field on and off.
AddHow the field lands: added light, or laid over the frame.
Texture / VideoSprite for the selected emitter.
Colour swatchColour of the selected emitter — its tint, and the whole particle when it has no sprite.
Starfield, Fairy, Snow, Embers, Confetti, Smoke, Rain, Dust, Sparks, Bubbles, Ash Whole-field looks. Each one sets count, size, speed, life, gravity, jitter and colour in one press; everything stays editable afterwards.
1 / 2Which emitter every slider below belongs to. Each emitter keeps its own settings.
Emit OnSwitches the selected emitter on or off without losing its settings.
CountHow many particles the selected emitter holds.
SizeSprite size in pixels, scaled to the render height, so the look survives a change of resolution.
AmountHow strongly this emitter is composited over the frame.
X / YEmitter position across and up the frame; y = 0 is the bottom.
AngleDirection the emitter throws; 90° is straight up.
SpreadWidth of the cone around that direction.
SpeedLaunch speed in percent of the frame height per second.
LifeHow long a particle lives, in seconds.
Gravity / JitterHow hard the field pulls down, and how much each particle wanders off its path.

Post

Four looks, two to a row, each with its own amount and an Off / percentage label. They stack in the order Bloom, Vignette, Scanlines, Grain.

BloomGlow gathered from the brightest parts of the frame.
VignetteDarkens the edges toward the centre.
ScanlinesCRT lines — one darkened line every two pixels.
GrainAnimated film grain; it freezes while playback is paused.

9Text & image

The Text tab draws over the picture: a playlist of lines, and an image, both sent to the output window as well. The panel is three blocks — Overlay, Text and Image — and everything in it is saved per shader.

The Text tab: the Overlay block with the mode and colour swatches, the Text box, the playlist with four lines and their controls, then the Image block
The Text tab with four lines in the playlist: each row shows its seconds, and the arrows, copy and cross appear on the row you point at.

Overlay

TextSwitches the overlay on and off, here and in the output window.
Word / TickerOne line at a time, or a tape running across the frame.
ColourThe colour of the line being played, with a picker and nine swatches for the usual stage colours.
Size / SpeedFont size, and either words per second (Word) or the speed of the tape (Ticker).
X / YWhere the text sits; 0 is the centre, and double-clicking a dot returns to it.
FontSans, Serif, Mono, Impact, Georgia, Courier, Verdana, Trebuchet or Times — it travels to the output window with the rest of the panel.
StrobeFlashes the text on and off this many times a second; Off keeps it steady.

Text

Type into the box and press Add: one line per entry, so a pasted list arrives as a playlist. Update replaces the line you have selected, Load .txt reads a text file into the playlist, and Clear empties it.

Playlist

  • Timer — the seconds a line shows before the next one starts. 0 keeps it on screen all the time, like a watermark.
  • ↑ ↓ — move a line up or down in the order. The playhead follows the line it was on.
  • ⧉ — copies the line in place, which is the quick way to make a variant.
  • × — takes the line out of the playlist.
  • Double-click a line — opens it for editing: text, seconds and colour, with Save and Cancel. Esc cancels and Ctrl/Cmd+Enter saves.
  • Alt + ↑ ↓ — moves the highlighted line while the panel is open, without reaching for the arrows.
  • The line under the list — how many lines there are, how long a full pass takes, and how many of them are watermarks (timer 0).
The playlist is a queue, not a caption. Lines play in order, one after the other, each for its own seconds, and the whole list loops. A line set to 0 never leaves the screen, so it works as a permanent watermark under the rest.

Image

ImageShows the picked image over the picture, here and in the output window.
Pick… / ClearChooses a logo or an advert from this computer, or drops it.
Size X / Size YThe image's size as a percentage of the frame.
X / YWhere it sits; double-click a dot for the centre.
StrobeFlashes the image on and off this many times a second.
TimerHow long the image stays up. Watermark pins it there for good.

10Record & present

Record in the show row turns the studio's own output into a file, and Present in the strip gives the picture the whole screen. Neither needs any other software.

Record

WebMVP9, software encoding — works on every machine. The default.
MP4H.264, which needs a hardware encoder on this machine; the dialog says so when it is not available.
Player in this windowRecords the picture as it is framed here, overlays included.
Slave windowRecords the output window instead, at its own size.

Recording starts straight away and the word stays filled while it runs. Press Record again to stop; the browser saves the file with its own download prompt. The strip and the panels are never part of a recording.

Present

  • Present hides the strip, the tree, the show row and the right quarter, and puts the picture full screen.
  • Esc comes back. So does clicking Present again if it is reachable.
  • Everything keeps running while it is up: shows, text, particles and the output window.

11Dialogs

Every dialog closes with Cancel or Esc and confirms with its main button or Enter. The note under the field explains what will happen before you commit.

DialogFields
Save showName box plus the list of shows already saved; the one matching your name is marked, because saving will replace it.
Load showThe saved shows, newest first. Picking one replaces the current line-up.
New folderName box for the new folder inside GLSL/.
RenameNew name, with the extension shown separately so it cannot be changed by accident.
DeleteThe exact path is spelled out before anything is removed, with a reminder when several files are ticked.
MoveEvery subfolder of GLSL/ — and the top level — as a list. With several files ticked it moves the whole set.
UploadThree kinds — texture, video, glsl script — each writing into its own folder.
Texture / VideoThe media list with a thumbnail per entry; Stop drops the running clip.
Stream URLAn address for an audio stream, offered as an input device.
RecordWebM or MP4, then the player in this window or the output window. See section 10.
Edit a playlist lineThe line's text, its seconds and its colour, with Save and Cancel. Ctrl/Cmd+Enter saves.
Source editorThe shader text with Save (writes and recompiles) and Cancel. Press Tab to keep indentation.

12Where things are stored

WhatWhere
ShadersGLSL/, one file per shader, any depth of subfolder.
MediaGLSL/TEXTURE/, GLSL/VIDEO/ and their lower-case twins, for the images and clips the channels and the effects use.
ShowsGLSL/shows/, one file per saved show; the show you are working on lives with the settings below.
Per-shader settingsInside GLSL/json/, one JSON file per shader named after its folder and file, so settings survive a reload and travel with the folder.
Tags, ticks, theme, playlistThe browser's own storage (localStorage), so they belong to that browser rather than to the folder.
The shader indexGLSL/manifest.php answers the file tree with a folder's names, sizes and dialect as JSON. It caches the answer in GLSL/.index/ and rebuilds it whenever the folder changes, so a new folder needs nothing added to it and a folder of 10,000 shaders costs the same one request as a folder of ten.
Embedded shader copybin/glsl-bundle.js — the copy the studio reads when it is opened from disk. Rebuild it with Rebuild bundle in the tree, or by opening bin/build-bundle.php in a browser; the served site reads GLSL/ directly and never needs it.

13Keys & mouse

InputDoes
spacePlay or pause the shader.
← →Previous / next shader in the folder you are browsing.
rReset the clock to zero.
sShow or hide the source panel under the picture.
EscClose a dialog, leave full screen, or come back from Present.
Alt + ↑ ↓Move the highlighted playlist line while the Text tab is open.
Double-click a playlist lineEdit its text, seconds and colour.
Double-click the pictureFull screen on and off.
Right-click the pictureThe player menu: edit shader, detach, clone, render size.
Right-click a shader or a folder chipThe file menu (rename, edit source, move, add to show, delete) or the folder menu (rename folder, remove chip).
Shift-scroll on the pictureExposure.
Double-click a slider dotReturns that control to its centre or its default.

Keys are ignored while you are typing in a field, so a name or a shader edit never triggers playback.

14Troubleshooting

SymptomWhat it means
The picture is blackThe browser has no WebGL2, the shader is paused, or the Render size is too low for that shader. Press space, then check the status line.
“Uploads need the local launcher”The studio is open from disk. Open it from the site or with one of the launchers to write files into the project.
Nothing appears in the file listServed: GLSL/ is empty, or you are inside a folder that holds no shaders — click the chip again to go back out. From disk: rebuild bin/glsl-bundle.js.
Settings look empty for one shaderThat shader has no saved JSON yet; it starts from the defaults.
“Shader did not compile”The error panel lists the compiler log. The previous shader keeps playing; fix the source from Edit shader.
No sound reaching the shaderBrowsers mute audio until the page is clicked, and the capture must include system audio, or come from a loopback device. Check the Level bar in Inputs.
The text does not appearText in the Overlay block must be on, and the playlist must hold at least one line.
Show will not startThe line-up is empty — add buttons with Add to show from the tree first.
Playback is heavyDrop Fps in Inputs, or the render size in the player menu, to 720p or 480p.
Recording saves nothingSome browsers refuse a capture while another one is running; stop the other recording, or pick WebM instead of MP4.

Verifying a copy of the project

sh bin/check-platforms.sh (or powershell -File bin\check-platforms.ps1) confirms that every platform's server binary is present, executable and matches the SHA-256 recorded in bin/server/LICENSES.md.