I wouldn’t consider Satchel dead since I’m still maintaining it. I’ve been working on rewriting Satchel using React Lua so that’s why I haven’t released a new version in a while or fixed any bugs since the rewrite covers that (and probably will add a bit more).
As it stands, there is clear demand for an inventory system and Satchel meets that demand. I’m happy with its current state which I consider stable and the only bugs currently with Satchel are minor.
In short, no updates because Satchel is in a good state and rewrite soon.
Satchel remains a great and relevant resource. I’ve found many aesthetic and practical uses due to how easy it is to understand & edit, fitting it to my specific needs.
Some may prefer it, but I personally wouldn’t use Satchel if it were built in React. It has a steep learning curve, I’ve heard many performance complaints and I don’t see a point outside of projects with tons of developers, who would most likely develop their own system anyways.
Regardless, thank you for the resource it has helped in my development quite a bit.
React Lua certainly isn’t without it’s issues. I’m up to discuss whether React Lua is right or not for Satchel and concerns with moving to it. Changing from pure Luau code to using a UI framework is a hard choice and I’ve put a fair bit of thought behind it.
Satchel is aging
Satchel is aging and needs a fresh start. Originally, it was a fork of the 2015 CoreGui backpack with some tweaks but after years of changes on the same old code, it’s beginning to be hard to maintain and impractical. The CoreGui backpack features deprecated methods, manual UI logic that can be replaced by instances, a lot of hacky code to work for things like specific platforms, etc which all manifests in a single 1000 script that even I can’t fully read or understand. Let’s be clear, original CoreGui was outdated never good to begin with and was made before Roblox supported VR, Roact (now React Lua), UI drag detectors, automatic size, UIListLayout, UIStroke, and a whole lot more.
Choosing React Lua
React Lua wasn’t the first consideration for Satchel. I looked at Fusion, Vide, and a few other smaller projects with the same goal which all are equal or in some cases better the React Lua.
A few reasons why I chose React Lua over everything else:
Maintained by Roblox and stable for years to come
Mirrors ReactJS, already popular with lots of documentation and large community
Matches Satchel’s philosophy of feeling native and using the same develop processes as Roblox
Some reasons I don’t like React Lua for:
High complexity and hard to learn. Not friendly for beginner scripters
Using JavaScript ideologies in Luau don’t translate well or make sense in some cases
Significantly increases the size of Satchel (we already use packages for TopbarPlus which is pretty large)
Roblox has already shown to me that they are willing to make investments with React Lua and modern UI such as the experience chat and leaderboard are made using React Lua which Satchel aims to be like.
Goals with moving to React Lua
They are a few goals I want to reach when I rewrite Satchel, most of them stability focused rather than adding more features.
Make it easier to maintain Satchel in the long run
Remove long standing bugs and deprecated code
Deeper customization and modernize the developer API
I understand that people like Satchel because it’s easy to modify and doesn’t use confusing and complex UI frameworks, but at the same time using pure Luau causes complexity as well. It’s whether you want a complex framework and simple code or no framework and complex code.
I don’t understand how to fix this bug, I’m not getting any errors. When I deactivate the backpack and then try to activate it again, it doesn’t work
Here’s the video:
local backpackEnabled = Satchel:GetBackpackEnabled()
local enableBackpack = not backpackEnabled
if backpackEnabled ~= enableBackpack then
local ok, err = pcall(function()
Satchel.SetBackpackEnabled(enableBackpack)
end)
if not ok then
warn("Satchel.SetBackpackEnabled failed:", err)
else
print("Satchel backpack enabled state set to:", enableBackpack)
end
else
print("Backpack already in correct state:", backpackEnabled)
end