How to add a utility to the marketplace
This guide explains what a "utility" is, how it differs from a full "system", and how to structure and upload utilities so they import and update reliably.
What is a utility vs a system?
- System: end‑to‑end gameplay or feature package (controllers, services, UI, assets, instructions). A system may include optional subsystems and bundled relevant systems.
- Utility: a smaller, focused, reusable building block (e.g., math helpers, data structures, small services) that can be shared across many systems. Utilities have their own identity and versions and are updated independently.
Key differences:
- Scope: Utilities are granular; systems are feature‑complete bundles.
- Versioning: Utilities must declare identity and version in
utilities_superbullet_meta.jsonand are upgraded independently. Systems usemetadata.jsonfor their version. - Priority on extraction: Utilities are processed and resolved first (never optional), before any system files are copied.
- Bundling: Systems can reference utilities; utilities should not depend on system‑specific structure.
Required: utilities_superbullet_meta.json
Utilities are discovered and reconciled using a root‑level file named utilities_superbullet_meta.json. This file exists at the zip root for the incoming template and at the workspace root after installation.
Schema (required fields):
[
{
"DisplayName": "My Utility",
"unique_id": "unique_id_of_uploaded_template",
"version_number": "1.2.3",
"created_by": "Superbullet"
}
]Processing rules:
- Read the Template’s
utilities_superbullet_meta.jsonfirst, before copying any other files. - Read the Workspace’s
utilities_superbullet_meta.json(or create it if missing). - For each incoming utility by
unique_id:- Not installed → install utility files and append entry.
- Installed with older
version_number→ replace utility files and update entry. - Installed with same/newer version → skip replace.
- Name collision with different/missing
unique_id→ prompt to rename or skip.
Notes:
- If a utility is missing its own
utilities_superbullet_meta.json(legacy), the importer will synthesize one using available provenance (fillsunique_idfrom TRF metadata andversion_numberfrom the system’s rootmetadata.json). - Utilities are never optional. They are installed or updated deterministically before the rest of the system extraction begins.
Zip layout (simplified for utilities)
Utilities use a simplified version of the TemplateSystem.zip contract. Most system-only components are omitted.
TemplateSystem.zip
├─ utilities_superbullet_meta.json # required for utilities; processed first
├─ metadata.json # required; contains name, description, and version
└─ Unpack_On_Source/ # primary location for utility code (text-based)You can ship a utility with utilities_superbullet_meta.json, metadata.json, and Unpack_On_Source/. Skip Unpack_On_Roblox_Studio/, To_Upload_By_User/, Optionals/, and Instructions.md entirely for utilities.
Required: metadata.json (zip root)
The setup for metadata.json is the same as for template assets. It contains the utility's name, description, and version information.
{
"version_number": "1.0.0",
"created_by": "Superbullet"
}- Use semantic versioning for
version_number(e.g., 1.0.1, 1.1.0, 2.0.0). - Bump
version_numberon every re‑upload so utilities update for everyone. created_byis set automatically by the uploader.
Recommended folder layout for a utility
Place the utility’s files under the appropriate service folders so merges are idempotent. Keep names stable.
TemplateSystem.zip
├─ utilities_superbullet_meta.json # required; processed first
├─ metadata.json # system‑level version (if part of a system)
├─ Unpack_On_Source/
│ └─ ReplicatedStorage/
│ └─ SharedSource/
│ └─ Utilities/
│ └─ MyUtility/
│ ├─ init.lua
│ └─ helpers.lua
└─ (other system folders if this utility ships with a system)Guidelines:
- Put shared code under
ReplicatedStorage/SharedSource/Utilities/<UtilityName>or your team’s chosen utilities root. - Avoid placing
.rbxm/.rbxmxhere. Those belong to Studio assets and are handled separately. - Keep the public API small and stable. Document expected inputs/outputs in comments or README inside the utility folder.
Versioning and updates
- Use semantic versioning in
utilities_superbullet_meta.json(major.minor.patch). - Bump versions whenever you change API or behavior.
- The importer compares versions and upgrades in place when the incoming version is newer.
Collisions and provenance
- The importer writes per‑folder provenance markers like
superbulletai_metadata.jsonfor Controllers/Services/Utilities when applicable. - If a folder with the same name exists but has a different or missing
unique_id, you’ll be prompted to rename incoming content or skip to avoid clobbering unrelated code.
Quick checklist before upload
utilities_superbullet_meta.jsonexists at the zip root and lists your utility with a stableunique_idand correctversion_number.metadata.jsonexists at the zip root with the correct version number (same setup as template assets).- Utility files are under a stable path (e.g.,
ReplicatedStorage/SharedSource/Utilities/<UtilityName>). - No
.rbxm/.rbxmxfiles inUnpack_On_Source/. - Skip
Unpack_On_Roblox_Studio/,To_Upload_By_User/,Optionals/, andInstructions.mdentirely for utilities.