Facet is not a component library. You do not install a Button — you run one command and a
button.tsx appears in your project, imports resolved and theme wired up. It is yours from that
moment: edit it, delete half of it, rename it. Nothing will overwrite your changes, because nothing
ever updates it.
What makes that model work is that the hard parts are not in the copied file. Behavior — focus,
layering, presence, controlled state, asChild — comes from Lattice UI, which is a
real dependency. Styling comes from Vela, which lowers className to Roblox
properties at compile time, so a component holds no Color3 and no UDim2 of its own. A Facet
component is a Lattice primitive wearing Vela classes; the file you own is the composition, and it
is short enough to read in one sitting.
Two small packages and a CLI are all that is published. @facet-ui/react-variants is the cva
equivalent every component imports, @facet-ui/theme supplies the semantic tokens as a Vela config
preset, and facet-rbxts fetches components from a
hosted registry rather than bundling them — so adding a component
does not require a CLI release.
# One command, and a file appears in your project.npx facet-rbxts initnpx facet-rbxts add button
# src/shared/ui/button.tsx is now yours — edit it, rename it, delete half of it.# There is no upgrade that will overwrite it, because there is no upgrade.Components
What the registry holds today.
Guides
Own the code you copied.
Reference
Every command, field, and token.
Every preview here is the real component.
The frames on the component pages render the actual registry source, lowered by the actual Vela compiler against the actual @facet-ui/theme tokens — the same file facet add would copy into your project, not a web imitation of it. Flip the site's light/dark toggle and the frame reloads a different build, because Facet resolves its colors at compile time and a build carries exactly one mode.
What a preview is not is Roblox. Loom reimplements Roblox layout; it does not run the engine. Studio is still the only place a component is really confirmed.
Scope and status →