Lumin is bringing developers the next generation of tooling for Roblox, with no cost associated. We believe that it is important that everyone has quality tooling; whether you’re a beginner or designing the top experiences, it’s our promise to provide you with quality tooling.
Lumin Framework is the ultimate game framework for Luau games. It comes packed with advanced dependency management systems and of course its own ease of use! It’s also the most lightweight framework, beating almost all available ones relative to features and size.
Lumin UI is an unrivaled and new UI framework for Roblox. It features a combination of all of the greatest parts of every popular UI framework; it’s based off of Fusion and React. It combines Fusion’s ease of use, React’s excellent developer API to make something very beginner friendly and performant. It’s also one of the most lightweight UI libraries just like Framework, yet it still features the essential parts of a UI framework and even more.
What’s Next
Lumin is hard at work creating some amazing plugins to improve your workflow. Now, you’re probably asking yourself: “What could they be working on?” The answer to this is two plugins that speed up some of the most important parts of game development. These will come later in Q2 2025, and you can view progress on our GitHub or Discord server.
lumin/creative (unreleased)
Lumin Creative is a creative suite for Roblox Studio (soon). It features a character creation dashboard, a skybox library with hundreds of professional skyboxes, a lighting editor, and a VFX library.
lumin/previewer (unreleased)
Lumin Previewer is a dashboard to preview any asset, data, or physics simulation without ever even starting a game. See physics using a play/pause UI with a timeline, read and edit datastore data, and preview assets such as decals and more.
Extra Resources
Made with by the developers and contributors at Lumin Labs
the main difference is the code internally. fusion and lumin UI might look similar on the surface level and both achieve the same thing, but Lumin UI fixes some pain points in Fusion. Lumin UI typically also has improved performance and it’s also a lot smaller.
Lifecycles are a QOL feature, I know a lot of cases where they can make or break people’s workflows.
You can check the github for more… the description included should be enough for someone to be intrigued
If you’re not interested, that’s fine, but it’s not worth reiterating on these points if I give you the answer.
local PlayerService = game:GetService("Players")
local Player = PlayerService.LocalPlayer
local UI = require(path.to.UI)
local New = UI.New
local Event = UI.Event
New "ScreenGui" {
Name = "SampleGUI",
IgnoreGuiInset = true,
Parent = Player:WaitForChild("PlayerGui"),
New "TextButton" {
AnchorPoint = Vector2.new(0.5, 0.5),
Position = UDim2.fromScale(0.5, 0.5),
Size = UDim2.fromOffset(100, 100),
ZIndex = 1,
Event("Activated", function()
print("Button clicked!")
end),
}
}
I’m not sure how Swift UI works, but these look quite similar. If you’re open to giving feedback on how I could make the workflow above better I’d love to hear it
The dream UI framework on Roblox for me is one that functions similar to SwiftUI.
One of my biggest complaints with UI frameworks on Roblox is that you have to Parent everything, and also do everything manually.
Here is a SwiftUI syntax that I could see working on Roblox based on your example.
local PlayerService = game:GetService("Players")
local Player = PlayerService.LocalPlayer
local UI = require(path.to.UI)
local New = UI.New
local Event = UI.Event
UI.newView { -- Creates a ScreenGUI.
UI.TextButton("Click Here") -- This immediately sets the text. You could also add a state variable in here.
.cornerRadius(12) -- Create a UICorner with a corner radius of 12
.onClick(function()
print("Button Clicked")
)
.size(UDim2.fromOffset(100, 100))
-- My idea was instead of Positioning, what if it all was vertical? Starting from the center of the screen!
}
.parent() -- If you insist on manually setting the parent, you can set it here.
.name("SampleGUI") -- If you insist on setting the name.
.ignoreGuiInset() -- Defaults to true, but you won't need a parameter. Idk if this is possible tho.
Well instead of setting everything (like Parent, Position, etc…) manually, and creating new objects like UICorner manually, I was thinking what if you declare it with one line of code. Turning this:
New "ScreenGui" {
Name = "SampleGUI",
IgnoreGuiInset = true,
Parent = Player:WaitForChild("PlayerGui"),
New "TextButton" {
AnchorPoint = Vector2.new(0.5, 0.5),
Position = UDim2.fromScale(0.5, 0.5),
Size = UDim2.fromOffset(100, 100),
ZIndex = 1,
Text = "Click Here"
Event("Activated", function()
print("Button clicked!")
end),
}
New "UICorner" {
CornerRadius = UDim.new(0, 12)
Parent = -- Text Button
}
}
We’re introducing a new upcoming plugin, Lumin Teams. Teams will allow you to better manage your team, and see what they are doing in live time while in Studio.