Ctrl+E for a screenshot. Ctrl+Shift+E for a 150-frame sequence. An ExportImage node for programmatic captures. And an output resolution system that decouples what you render from what the window happens to be.
Spacebar opens a tabbed node creator. Plus four UX changes in one commit: richer inspector widgets, undo coalescing, copy/paste, and wire depth fading.
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.
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.
Six nodes the spec was missing, two GPU memory leaks, and a pile of small texture-engine fixes. The texture pipeline is finally done.
A VideoPlayer node with feature-gated FFmpeg decoding — MP4, MOV, WebM, anything FFmpeg supports — with seeking, looping, variable rate, and frame caching.
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.
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.
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.
Two nodes that bridge Lux's two rendering worlds — RenderTarget converts 2D vector layers into GPU textures, TextureToLayer brings them back.
Eight GPU filter nodes — Blur, Brightness, Contrast, Invert, Threshold, HueShift, Saturate, EdgeDetect — each a WGSL shader wrapped in a single Rust file.
Three nodes that create textures from nothing — LoadImage for files, SolidColor for flat fills, and NoiseTexture for procedural Perlin, Simplex, and Worley patterns.
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.
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.
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.
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.
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.
Proper z-ordering, smarter tooltips, a disappearing inspector, search that opens where you're looking, and a theme system that replaces every magic number.
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.
Equal, Greater, Less, InRange, And, Or, Not, Xor. The decision-making layer of the node graph.
Memory across frames. Feedback loops, named state transitions, and keyframed values.
Add, Subtract, Multiply, Divide, Sin, Cos, Lerp, SmoothStep, Map, and 33 more. Polymorphic, type-preserving, NaN-safe.
Counter, Select, Switch, Toggle, FlipFlop, Sequencer, SampleAndHold. The logic layer that ties animation together.
Timer, Metro, Delay, Debounce, Throttle, OnChange. When things happen matters as much as what happens.
Raw data is jagged. These nodes make everything smooth, bouncy, or shaped exactly how you want.
The heartbeat of any patch. Three oscillator nodes that make things move.
I tore apart the eval loop and rebuilt it. Pre-allocated buffers, cached adjacency maps, borrowed NodeInfo. No allocations in the hot path.
I stopped building features and fixed the foundation. Crate boundaries, structured logging, headless GPU testing.
Double-tap Shift. Find anything. Create nodes, jump to existing ones, run commands. The fastest way to do anything in Lux.
Wire selection with glow, Alt+drag scissors, and undo/redo. The small interactions that make an editor feel real.
What if you never wrote a loop again? One wire carries [10, 20, 30, 40, 50]. Every node downstream evaluates per-element automatically.
Four ways to see your output. Because live performance doesn't care about your editor layout.
egui panels, a node canvas, pin tooltips, wire highlights. Am I now a UX designer????!!!!
wgpu + Vello + a blit pipeline. Getting the first shape rendered was harder than expected.
First week of Lux. Nodes, pins, wires, a graph evaluator, and 462 tests. Here's how the core engine came together.
Starting Lux, a cross-platform visual programming system for all of us creative coders, installation makers, and visual people. Have to start somewhere.