Devlog

The Create Dialog and a UX Round

Spacebar opens a tabbed node creator. Plus four UX changes in one commit: richer inspector widgets, undo coalescing, copy/paste, and wire depth fading.

Save and Load: The .lux File Format

Ctrl+S, Ctrl+O, a proper .lux project format, and one sneaky bug where nodes were invisible after loading because the render cache didn't know anything had changed.

Smoothing, but for Everything

Damper, Spring, SmoothDamp, Ease, and Ramp used to only speak Number. Now they handle Vec2, Vec3, Vec4, and Color, component-wise, with output types that match whatever you plug in.

Finishing Phase 7

Six nodes the spec was missing, two GPU memory leaks, and a pile of small texture-engine fixes. The texture pipeline is finally done.

Video Playback

A VideoPlayer node with feature-gated FFmpeg decoding — MP4, MOV, WebM, anything FFmpeg supports — with seeking, looping, variable rate, and frame caching.

Extended Texture Processing

Seventeen new texture nodes across four crates — transforms, compositing, analysis, and post-FX including bloom, chroma key, tone mapping, and a seven-mode blend node.

Custom WGSL Shaders

PixelShader and ComputeShader nodes that let users write custom WGSL with auto-detected uniforms, dynamic input pins, and a hand-rolled shader parser that makes it all work.

Feedback Loops

A Feedback node that composites the previous frame with the current one — trails, echoes, and accumulation effects, plus the GC trick that makes it possible.

Layer ↔ Texture Bridge

Two nodes that bridge Lux's two rendering worlds — RenderTarget converts 2D vector layers into GPU textures, TextureToLayer brings them back.

Texture Filters

Eight GPU filter nodes — Blur, Brightness, Contrast, Invert, Threshold, HueShift, Saturate, EdgeDetect — each a WGSL shader wrapped in a single Rust file.

Texture Sources

Three nodes that create textures from nothing — LoadImage for files, SolidColor for flat fills, and NoiseTexture for procedural Perlin, Simplex, and Worley patterns.

GPU Texture Pipeline

Lux gets a GPU-resident texture processing engine — handle-based allocation, free-list pooling, shader caching, and a declarative op system that keeps plugins completely decoupled from wgpu.

Stop Cloning Everything

Four performance improvements that boil down to one lesson: stop copying things you don't need to copy. Arc-wrapped layers, zero-alloc output maps, borrowed spread slices, and a wire drag fix.

The Cleanup Episode

A deep code review found 39 issues, a 274KB font was being copied every frame, circles were made of 360 line segments, and five unwrap() calls were lurking in the render pipeline. We fixed all of it.

Shapes, Docs, and Polish

A big session: 6 new shape primitives, inline documentation for every node and 203 pins, smarter tooltips, z-ordered nodes, search-at-cursor, a Filter node, and an adversarial review that caught 14 issues before users could.

Filter: The Missing Spread Node

A new Filter node lets you keep only the elements you want from a spread using a boolean mask. Wire a comparison node into the mask and you've got conditional data flow.

Editor Polish, Round One

Proper z-ordering, smarter tooltips, a disappearing inspector, search that opens where you're looking, and a theme system that replaces every magic number.

Every Node, Documented

110 nodes and 203 pins now carry structured documentation — summaries, descriptions, tags, cross-references, and per-pin help text — all the way from source code to the editor UI and a machine-readable JSON export.

42 Math and Logic Nodes

Add, Subtract, Multiply, Divide, Sin, Cos, Lerp, SmoothStep, Map, and 33 more. Polymorphic, type-preserving, NaN-safe.

Animation: Timing Nodes

Timer, Metro, Delay, Debounce, Throttle, OnChange. When things happen matters as much as what happens.

Zero-Allocation Evaluation

I tore apart the eval loop and rebuilt it. Pre-allocated buffers, cached adjacency maps, borrowed NodeInfo. No allocations in the hot path.

Search Everywhere

Double-tap Shift. Find anything. Create nodes, jump to existing ones, run commands. The fastest way to do anything in Lux.

Wires and Undo

Wire selection with glow, Alt+drag scissors, and undo/redo. The small interactions that make an editor feel real.

Spreads: The Core of Lux

What if you never wrote a loop again? One wire carries [10, 20, 30, 40, 50]. Every node downstream evaluates per-element automatically.

The Editor Takes Shape

egui panels, a node canvas, pin tooltips, wire highlights. Am I now a UX designer????!!!!

Hello World: Introducing Lux

Starting Lux, a cross-platform visual programming system for all of us creative coders, installation makers, and visual people. Have to start somewhere.