Skip to content

FluxFast and easy interfaces for Luau.

Be lazy. Do more. Go fast.

Be lazy yet effective

Flux leans on Luau's type checker so your editor does the heavy lifting. When you declare a TextLabel or Frame, you get autocomplete for every valid property, event, and expected type.

Editor autocomplete for Flux: choosing the Frame class, completing the inherited Name property, and a red squiggle on an invalid property.

Do more with less

Every reactive node supports __call and operator overloading, so reading and writing state takes no extra ceremony. Call count() to read and count(1) to write. Arithmetic, comparison, and string interpolation track dependencies automatically, so reactive expressions read like normal Luau.

luau
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Flux = require(ReplicatedStorage.Flux)
local new = Flux.new

local count = Flux(0)

new "ScreenGui" {
	Parent = playerGui,

	new "TextButton" {
		Size = UDim2.fromOffset(200, 50),
		Text = function() return `Clicks: {count}` end,
		Activated = function() count(count + 1) end,
	},
}

Go fast waste nothing

Dormant computations sleep with zero subscriptions until something observes them. Active bindings batch updates once per frame and run in dependency order. If a computed value doesn't change, downstream bindings don't re-run.

Luau reactivity benchmark