Satchel // Open-source modern backpack system

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.

4 Likes

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’m open to feedback about this.

5 Likes

how do i force a tool into a specific slot i want to make it so that a tool always starts at a specific slot when picked up

2 Likes

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

the documentation will need to be corrected
SetBackpackEnabled is self

Is there a way to use our own UIs like image labels to give it more customization?