CarbScan Docs
Responsive Beginner-friendly

CarbScan Self Checkout Machine Documentation

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.

Start here

Easy path first

The newer CrbPack instructions say you can usually drop the folder into Workspace and let the pack organize itself.

Custom item support

Items mainly depend on a few values like Object, Price, and optional SavingsPrice.

Legacy notes included

The older API and model-linking flow is still documented here, but separated so it is easier to follow.

Quick Start

Best place to begin if you just want the machine working without reading all the legacy stuff.

Recommended v3.5.0
1

Put the CrbPack folder in Workspace

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.

2

Test first, edit second

Run the base setup before changing items, UI, or status lights. That makes it way easier to spot what broke later.

3

Use the included CustomItem as your template

The README points to the built-in CustomItem so you can understand the value structure before making your own product.

Easiest rule: start with CrbPack v3.5.0, then only go into the legacy/API section if you actually need older behavior or multi-product linking.

Custom Items

These are the values you actually need to care about when adding your own items.

Main values

  • Object — item name shown on the checkout.
  • Price — normal price shown on the machine.
  • SavingsPrice — optional loyalty-card price.

Good first test

Use something simple like “Water” with a price like “2.50” so you can confirm your item shows up correctly before adding more products.

Example value layout
CustomItem
├── BoolValue
├── BoolValue
├── StringValue: Object = "Water"
├── StringValue: Price = "2.50"
└── StringValue: SavingsPrice = "1.99"
The README says editing SavingsPrice is optional. The most important edits are the bottom string values.

Settings

Simplified explanations for the settings module so you do not have to decode the README paragraph by paragraph.

Setting Meaning
CarbNetNot required anymore in the newer setup. Can usually stay true or false.
UiSelects which UI folder the screen uses.
DefaultStatLightChooses which status light model is loaded.
PinUniversal employee PIN for products that need it.
TimeBetweenScanDelay between scans / debounce.
BootUpShows the boot-up sequence.
UnlockFromNetLegacy/theoretical unlock support tied to older network behavior.
ArePluginsEnabledMainly for deeper internal/plugin behavior rather than normal setup.

Probably legacy or unused

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.

Safe editing habit

Change one setting at a time, test, then continue. Tiny steps save a lot of pain.

Custom UI

The README says this should work, but it was not heavily tested. So keep backups.

1

Find the current UI folder

Open the screen model and look for the folder that contains the default interface.

2

Duplicate it

Copy the folder, rename it to something like Custom, and keep the original as a backup.

3

Customize without renaming required parts

You can edit visuals, but the README warns not to delete or rename things the scripts depend on.

4

Set the new folder name in settings

Change Ui from Default to your custom folder name.

Status Lights

Swapping the light model is easier than making a full custom UI.

Using included lights

  • Find the extra lights in TriLights.
  • Move the one you want into Plugins > ModelPlugins.
  • Move or remove the old DefaultLight.
  • Change DefaultStatLight to the new model name.

Making your own

The README says your custom tri-light should have two parts named StatusLight and StatusLight2, with the rest matching the provided examples.

Example setting
DefaultStatLight = "ZebraTriLight"

Legacy API

Only use this part if you are dealing with the older v3.1.5PT/API workflow or linking multiple CRB products together.

Legacy Advanced

Old compatibility values

Older item setup required Object and Price string values plus a HasBeenBought BoolValue at the root of the tool/item.

MODEL letters

The README explains that the MODEL value like A or B is used to distinguish different machines when products talk to each other.

Require the API module
local API = require(game.ReplicatedStorage.CrbAPI.API)
Fire a legacy API function
API.functions.Example("Model", "Color", "Request", "Reason")
The README describes the flow roughly as Invoker > API > API event > APICall > Logic, with the reason value deciding what function should run.