Try it in your browserpreview Source

Roswaal types✎

What a pin's type means, and where it differs from Luau's.

Verified

A pin's type does two jobs: it decides its colour, and it decides what will connect to what. It is not a Luau type annotation — it is a promise about the value, kept deliberately coarser than Luau's own type system so that wiring stays a yes-or-no question rather than a typechecking session.

The types

TypeHoldsNotes
booleantrue or false
numberA Luau numberNo integer/float split; Luau has one number type.
stringTextQuoted for you when it is emitted.
tableAny Luau tableOne type for arrays, maps and sets, because Lua has one.
functionA function valueGet Function produces one.
InstanceAny Roblox instanceA class such as Model narrows it. Is A asks at runtime.
Vector2, Vector3, CFrame, Color3, UDim, UDim2Roblox value typesAll splittable — see below. Every operation on them is under Engine types.
BrickColorA colour from Roblox's fixed paletteNot a Color3, and not interchangeable with one. Read .Color to get the Color3 behind the name.
TweenInfo, TweenHow a tween moves, and a running oneA TweenInfo is a description and can drive any number of tweens; a Tween is the thing that plays.
RBXScriptSignalA Roblox eventWires into Connect Event.
RBXScriptConnectionA live connectionWhat Connect Event hands back.
luauHand-written LuauOnly on Custom Code and Luau Expression. See below.
anyAnythingConnects both ways. What a node returns when it cannot say more.
wildcardAnything, so farMeant to adopt the type it is wired to. It does not yet — see Known gaps.

Info

A pack adds a type just by naming one: a Quaternion pin connects only to other Quaternion pins.

What connects to what

  • The same type always connects.
  • any connects to anything, in both directions.
  • number and string connect either way, because Luau coerces them. The wire is drawn as a gradient between the two colours to say so.
  • Execution and data never connect.
  • Everything else is refused during the drag, rather than at compile time.

luau is a type, not a string

Custom Code and Luau Expression have a pin typed luau. It holds code you write, and clicking it opens a proper editor with highlighting and completion.

Tip

Those two pins are the only places hand-written Luau enters a graph, so reviewing one means scanning for two node titles.

It is a pin type rather than a badge on a string because it is a different kind of pin, and a type says that more plainly than a warning does.

Pins that are typed in, not wired

Some inputs become part of the generated source rather than a value it reads: a property name in Get Property, the type in Cast. They are marked literal in the reference, and the editor refuses a wire to one during the drag rather than letting the compile fail later.

luau
-- Get Property, with Property typed in as "Name"
print(instance.Name)

-- The name is part of the code, not a value it reads.

Optional arguments

Some inputs read default in a dashed box rather than showing a value. Those are optional: left alone, the argument is not passed at all, and the call uses whatever it would have used anyway. Click one to set a value; the × beside a value you set puts it back.

Info

Optional is not the same as a default. A default left alone emits its value; an optional pin left alone emits nothing — and many Roblox constructors reject an explicit nil. Set a later optional pin and the ones before it are written as nil, to keep its position.
luau
-- nothing set
TweenInfo.new(1, Enum.EasingStyle.Quad, Enum.EasingDirection.Out)

-- repeat count set to 2
TweenInfo.new(1, Enum.EasingStyle.Quad, Enum.EasingDirection.Out, 2)

-- only the delay set: the gap before it has to be held open
TweenInfo.new(1, Enum.EasingStyle.Quad, Enum.EasingDirection.Out, nil, nil, 0.5)

Only trailing unset arguments disappear. One with a set argument after it is passed as nil, because dropping it would shift everything left and the delay would arrive as the repeat count.

Splittable types

Vector2, Vector3, CFrame, Color3, UDim and UDim2 come apart into their components — right-click a pin and pick Split Struct Pin. CFrame offers three decompositions; the rest have one. Splitting and recombining never change what the graph compiles to.

Where Luau's types come in

This page is about the types a pin has: what may be wired to what, and the colour it is drawn in. Luau's own type system is richer, and everything that crosses between the two — casts, declared types, and the annotations Roswaal writes into the generated file — is on Casting and annotations.

Last reviewed 11 September 2026 by @neopolitans