LightEater
A slime mold that eats the light. A million agents follow one rule, sense ahead, turn toward the brightest trail, step, deposit, and the veins they leave are the picture. Point a camera at yourself and the mold finds you. Or switch to Dither and the same camera comes back printed live, in two to sixteen tones of one palette.
This page can use your camera. The feed goes straight from the camera into your graphics card, inside this tab. Nothing is recorded, nothing is uploaded, and there is no analytics or tracking anywhere on this page. You can check: the page makes no network requests once loaded (the optional person matte fetches its model from this site, and only when you pick it).
Without a camera it runs on a synthetic light field instead. Your browser will ask permission first; on phones the page must be served over https for the camera to be offered at all.
This browser cannot run the instrument.
It needs WebGL2, which every current browser has when hardware acceleration is on. Physarum also needs float render targets; Dither does not.
Camera off until you say so.
Keys
- Esc
- menu: pick Physarum, Dither or Auto (1, 2, 3, or O, D, A while the menu is up). The menu button on the deck does the same, and in fullscreen it is the way in, since the browser keeps Esc for leaving fullscreen.
- O D
- switch straight to Physarum or Dither
- A
- sound react: the picture moves with the room. In Physarum bass swells the light, treble quickens the veins, and a sharp hit bursts agents onto the subject; in Dither the bass pushes the contrast. This asks for the microphone, a separate permission from the camera, only when you turn it on; the audio never leaves the tab.
- S
- sound sensitivity: x0.5, x1, x1.5, x2, x3
- R
- auto: let the running tool play itself. Physarum re-casts every 45 to 75 seconds, a new look, colour and physics, sometimes a burst or a wave. Dither re-casts every 25 to 55 seconds, a new look, palette, pattern, bit depth and grain, and half the time an echo. The first re-cast lands within a few seconds. Any scene key hands it back to you; burst, wave, matte, depth, background, blackout and sound do not. It rests while the menu is open. The screen stays awake while it plays.
- Space
- blackout. An amber tick in the corner says it is on.
- I
- hide or show the status line
- F
- fullscreen
- camera
- the deck button turns the camera off and on again, in either tool. Turning it back on may ask for permission again; it never asks for the microphone.
- ?
- jump to this list. A key the running tool does not know says so.
Physarum
- 1 to 5
- looks: veinwork, amoeba, ghost, lightning, breath
- [ ]
- body point (the physics under whatever is in frame)
- , .
- field point (the physics of the room)
- X
- swap body and field
- B
- burst: a third of the organism teleports onto the subject in a bloom of light. A tap on the picture bursts where you touched.
- W
- wave: a shockwave. Every agent races outward from the subject behind an expanding ring of light.
- C
- colour: arctic, fire, aurora, violet, toxic, rose, mono, video
- M
- matte: auto, motion, saliency, person, edges, luma. The person matte fetches its model from this site (about 10 MB, once) the first time you pick it; the camera feed still never leaves the tab.
- H
- depth: the veins lit as raised tubes, or flat glow again. Each look has its own depth, from 0.5 on the soft blob looks to 0.9 on veinwork and lightning. An auto re-cast keeps the new look's own depth.
- V
- background: off, veil (the feed's light through the palette), full (the feed itself). The mold stays on top; without a camera the synthetic field shows instead.
- 0
- reset to veinwork
Dither
- 1 to 3
- looks: menu (blue noise, one bit, fine), phosphor (Bayer, two bits, green), stream-safe (blue noise, one bit, coarse)
- N
- pattern: Bayer, a 4x4 crosshatch, or blue noise, an even 64x64 grain
- B
- bits: 1, 2, 4. One bit is ink and paper, two bits give four tones, four bits run the palette's whole ramp.
- G
- grain: steps through 72, 144, 240 and 360 rows (the stream-safe look starts coarser, at 56). Fewer rows, bigger dots.
- C
- colour: sixteen palettes, mono first, amber and green phosphor to cga
- X
- swap ink and paper
- E
- echo: off, short, long. Whatever moves leaves ghost copies that break into dots as they fade: on the beat with sound on, five times a second without it. A still scene shows nothing new. Only this page has it; the desktop app does not yet.
- - =
- fine tune the contrast
- 0
- reset to the menu look, blackout off
What it is
The Jones transport-network model (Jeff Jones, Artificial Life 16(2), 2010). Each agent reads the trail map at three points ahead of it, turns toward the strongest reading, steps forward, and lays trail; the map is blurred and decayed every frame. Vein networks grow, merge, and re-route out of nothing but that loop.
Two things make it an instrument rather than a screensaver. The matte is the pen: every parameter has a field value and a body value, and each agent runs on the blend of the two under the silhouette, so you and the room literally run different physics. And light is food: the camera's brightness is added to what the sensors read, so the mold chases whatever is lit. Move a lamp and it follows.
The veins are lit like raised tubes. A light circles the picture once every 48 seconds and dips lower on the beat when sound is on, so each vein gets a bright edge and a dark crease, and the thin ones read as running under the trunks. H turns it flat and back.
Dither is the second tool. It prints the camera in a few inks: every dot is checked against a threshold pattern, either a 4x4 Bayer grid (the crosshatch of old newspapers and handheld game screens) or a 64x64 blue-noise field (an even grain with no visible grid), and lands on the nearest of two to sixteen tones. It runs the desktop's own dither shader, vendored file for file, and it checks itself: the status line at the bottom reads parity 48/48 when your graphics card matches the desktop in all 48 checks (I hides or shows it). The desktop's error diffusion (Floyd-Steinberg and friends) and its ASCII mode are not here yet.
Auto, the third card on the menu, is the desktop's autopilot, running on the desktop's own timing. Every 25 to 55 seconds it re-casts the tool on screen, and every four to seven re-casts it walks to the other tool, boot card and all, so an evening left running has movements. Dither has only three looks here, so each of its re-casts also draws a palette, a pattern, a bit depth, a grain and, half the time, an echo. On blue noise, auto also boils the grain: the dots re-roll every few frames, faster with the treble and at once on a beat, so one bit reads as more greys. Echo and boil are this page's own; the desktop app has neither yet. It is a guest, not a driver: the first scene key you press hands the picture back to you.
This page is the basic browser version of LightEater, the full desktop instrument (AGPL), and it runs the desktop's own simulation shaders, vendored file for file. The full app adds projector output, a signal rack, and 4K quality tiers; this page runs the agents and the trail on your graphics card and scales the agent count to what your machine can hold at speed, so the count in the status line is yours, not a fixed number.
Privacy
The camera feed is uploaded frame by frame into a texture on your GPU and read only by the shaders on this page. It is never drawn to anything that is saved, never sent anywhere, and this page loads no analytics, no fonts from the video path, and makes no requests after it has loaded. Close the tab or press camera off and the stream stops; camera on brings it back. The source is in the open, so you do not have to take our word for it.
One exception, and it is opt-in: the person matte runs a segmentation model (MediaPipe selfie segmentation, Apache-2.0) in your browser. Picking it fetches the model and its runtime, about 10 MB, from this site's own origin, once. No third-party server is contacted, the model runs entirely in the tab, and the camera feed still goes nowhere. Until you pick it, nothing of it is even downloaded.
Sound react is its own, second opt-in. The microphone is never requested together with the camera: the page asks for it only when you press A or the sound button, as a separate permission you can decline on its own. The audio is reduced to a few loudness numbers by an analyser inside this tab, drives the picture, and is discarded; it is never recorded, never sent anywhere, and turning sound react on or off makes no network request of any kind. Press A again, or close the tab, and the microphone stops. If you decline, sound react simply stays off and everything else keeps working.