Easy path first
The newer CrbPack instructions say you can usually drop the folder into Workspace and let the pack organize itself.
This page rewrites the GitHub instructions into a cleaner docs website with a softer layout, simpler wording, and visual examples from the repository. The newer CrbPack v3.5.0 setup is the easiest starting point, while the older v3.1.5PT notes are kept below for legacy/API use.
The newer CrbPack instructions say you can usually drop the folder into Workspace and let the pack organize itself.
Items mainly depend on a few values like Object, Price, and optional SavingsPrice.
The older API and model-linking flow is still documented here, but separated so it is easier to follow.
Best place to begin if you just want the machine working without reading all the legacy stuff.
The newer repo instructions say you “literally don’t need to do anything” beyond placing the CrbPack folder into Workspace, because the pack should sort itself into the right places.
Run the base setup before changing items, UI, or status lights. That makes it way easier to spot what broke later.
The README points to the built-in CustomItem so you can understand the value structure before making your own product.
These are the values you actually need to care about when adding your own items.
Use something simple like “Water” with a price like “2.50” so you can confirm your item shows up correctly before adding more products.
CustomItem
├── BoolValue
├── BoolValue
├── StringValue: Object = "Water"
├── StringValue: Price = "2.50"
└── StringValue: SavingsPrice = "1.99"
SavingsPrice is optional. The most important edits are the bottom string values.
Simplified explanations for the settings module so you do not have to decode the README paragraph by paragraph.
| Setting | Meaning |
|---|---|
CarbNet | Not required anymore in the newer setup. Can usually stay true or false. |
Ui | Selects which UI folder the screen uses. |
DefaultStatLight | Chooses which status light model is loaded. |
Pin | Universal employee PIN for products that need it. |
TimeBetweenScan | Delay between scans / debounce. |
BootUp | Shows the boot-up sequence. |
UnlockFromNet | Legacy/theoretical unlock support tied to older network behavior. |
ArePluginsEnabled | Mainly for deeper internal/plugin behavior rather than normal setup. |
The README openly says some settings are old, not used, or maybe no longer work. So it is smart to only change the obvious settings first.
Change one setting at a time, test, then continue. Tiny steps save a lot of pain.
The README says this should work, but it was not heavily tested. So keep backups.
Open the screen model and look for the folder that contains the default interface.
Copy the folder, rename it to something like Custom, and keep the original as a backup.
You can edit visuals, but the README warns not to delete or rename things the scripts depend on.
Change Ui from Default to your custom folder name.
Swapping the light model is easier than making a full custom UI.
TriLights.Plugins > ModelPlugins.DefaultLight.DefaultStatLight to the new model name.The README says your custom tri-light should have two parts named StatusLight and StatusLight2, with the rest matching the provided examples.
DefaultStatLight = "ZebraTriLight"
Only use this part if you are dealing with the older v3.1.5PT/API workflow or linking multiple CRB products together.
Older item setup required Object and Price string values plus a HasBeenBought BoolValue at the root of the tool/item.
The README explains that the MODEL value like A or B is used to distinguish different machines when products talk to each other.
local API = require(game.ReplicatedStorage.CrbAPI.API)
API.functions.Example("Model", "Color", "Request", "Reason")
Invoker > API > API event > APICall > Logic, with the reason value deciding what function should run.