Manifest reference
redotcom/docs/specs/2026-10-25-pack-framework.md, redotcom/packages/viewer/src/packs/registry.ts:527-535, redotcom/packages/creator-contracts/src/packs.tsEvery field of the pack manifest, generated from the pack contract.
Status: Format only. A v2 pack is checked against these fields and stored on your device; nothing in the game applies one yet (the pack-framework spec, "Import": the registry refuses apply). Each kind has its own status on Pack kinds.
A v2 pack is a zip whose root holds the manifest s2u-pack.json: a JSON object with the fields
below and no others (an unknown field is refused with pack.FIELD_UNKNOWN). Every list on this page is read from the
pack contract's code, so it is the checker's own list.
Manifest fields
| field | what it is |
|---|---|
format | Required. Always the text s2u-pack: it says the file is a v2 pack manifest. |
formatVersion | Required. Always the number 2. Any other value is refused with pack.FORMAT_VERSION. |
id | Required. The pack's id: 1 to 64 characters of lower-case a-z, 0-9, dots and hyphens, starting and ending with a letter or digit, with no ... It may not begin with mod., model. or texture.: those prefixes are kept for the earlier formats. |
version | Required. The pack's version, a semantic version such as 1.0.0 (a pre-release such as 1.0.0-beta.1 is allowed here, but not by Thunderstore). |
name | Required. The pack's display name: 1 to 48 printable ASCII characters. |
description | Optional. A short description: up to 400 printable ASCII characters. It is part of the pack's identity hash, so changing it changes the pack's hash. |
target | Required. The disc revision the pack is for. It must be exactly the build's target (see PACK_TARGET_US below); an earlier spelling is refused and the finding names the canonical one. |
contract | Required. A version range, such as ^0.1.1, that the build's engine contract version (ENGINE_CONTRACT_VERSION) must satisfy. Ranges take *, =, >, >=, <, <=, ^ and ~, sets separated by spaces and alternatives by ||. A pack of kind rules must not admit any engine before 0.1.1. |
kinds | Required. A list naming each of content, rules and system at most once, and at least one of them: what the pack contains. |
sides | Required. One of client, server or both. The check only tests that it is one of the three; nothing else in the contract reads it. The earlier formats are read as client. |
dependencies | Required, empty when there are none. A list of at most 64 entries, each either {id, range} (another pack, by its id and a version range) or {archive, sha256} (one of your own disc archives, by its path and SHA-256). The same id or archive may not appear twice, and a pack may not depend on itself. |
files | Required, at least one row. Every member of the pack except the manifest itself, one row each (see the files row below). A file in the zip that is not listed is refused, apart from Thunderstore's root files beside the manifest. |
intents | Required. A list of at most 64 entries, each {kind, files}: which members a change is declared to be, and what kind of change it is. Every member must be named by at least one intent. |
handlers | Optional. A list of at most 32 claims on handler slots the engine owns (see the handlers claim below). No pack code runs: a claim only names a handler the engine already has. |
A files row
| field | what it is |
|---|---|
path | The member's path inside the pack: relative, forward slashes, at most 240 characters and 16 folders deep, with no .., drive, leading slash, colon, percent sign, control character, hidden (dot-led) or reserved segment. It may not be s2u-pack.json or one of Thunderstore's root files. |
sha256 | The SHA-256 of the member's bytes, as 64 lower-case hex digits. The check hashes the member and refuses it when the hash differs. |
size | The member's size in bytes, a whole number of 0 or more. The check compares it with the stored size before reading any bytes. |
role | What the member is: one of the roles below. The path's file type must be one the role allows. |
A handlers claim
| field | what it is |
|---|---|
slot | The engine-owned slot the pack claims, a dotted lower-case name of at most 64 characters such as visual.post. A pack claims a slot at most once. |
handler | The engine handler the pack asks for on that slot, a dotted lower-case name of at most 64 characters. It must be one the build offers for that slot, or the claim is refused with pack.HANDLER_UNKNOWN. |
actions | Optional. A list of at most 64 distinct dotted lower-case action names the claim uses; each must be one the handler offers. |
options | Optional. A plain JSON object handed to the handler: at most 4096 bytes of JSON, nested at most 2 deep, finite numbers only, and no __proto__, constructor or prototype key. The contract checks only this shape; the handler checks what is in it. |
Kinds
| kind | what it is |
|---|---|
content | Content: assets and maps (models, textures, sounds, collision, data, an authored map). The earlier formats are read as content packs. The check sets no rule of its own on this kind. |
rules | Declarative rules for a game mode, in rules-role JSON members: data only, never code. A rules pack's contract must start at 0.1.1 or above, and its members' capabilities must agree with its handlers claims. |
system | Engine systems: changes made through claims on engine-owned handler slots (the one such slot today is the full-screen picture pass visual.post). The check sets no rule of its own on this kind. |
The earlier formats
An earlier loader's pack has no s2u-pack.json; the contract reads it through an adapter as a v2 content pack.
| legacy kind | what it is |
|---|---|
mod | An s2u-mod v1 data-override mod. It is read as the pack mod. plus its id, its files as role data under a gameplay-value intent; a version that is not a semantic version is kept as 0.0.0+legacy. plus the old version. |
model | The model pack (glTF models in place of the game's meshes). It is read as model.current version 1.0.0, its files as role mesh under a cosmetic intent. |
texture | A texture pack for one map. It is read as texture. plus the map's name, version 1.0.0, its files as role texture under a cosmetic intent with their own SHA-256 and sizes, and the map archive as a disc archive dependency when the pack records the archive's SHA-256. |
Sides
| side | what it is |
|---|---|
client | The value client. The check accepts it; the contract gives it no further rule. |
server | The value server. The check accepts it; the contract gives it no further rule. |
both | The value both. The check accepts it; the contract gives it no further rule. |
Roles and payload types
A files row's role names what the member is; its path must end in one of the role's file types (case does not
matter), or the row is refused with pack.ROLE_MISMATCH. A role that changes play cannot be covered by a cosmetic
intent alone.
| role | file types | changes play | what it is |
|---|---|---|---|
mesh | .glb, .gltf | no | A 3D model in glTF form. |
texture | .png, .ktx2, .rgba | no | An image. |
audio | .ogg, .wav | no | A sound. |
collision | .json, .glb | yes | Collision data, as JSON or a glTF binary model. |
gameplay | .json | yes | A JSON member of gameplay values. |
rules | .json | yes | A JSON rules member (a rules spec). It is bounded by PACK_RULES_MEMBER_BYTES_ADAPTATION, read whole once, and must be a UTF-8 JSON object whose capabilities, when present, is a list of {slot, handler, actions?}. |
system | .json | no | A JSON member for a system claim. |
data | any | no | Any other data; any file type. |
legacy-manifest | .json | no | An earlier format's own manifest, kept as a member when the contract reads an earlier pack. |
Intents
| intent | what it is |
|---|---|
cosmetic | The members change only how the game looks or sounds. A collision, gameplay or rules member cannot be covered by cosmetic alone. |
gameplay-value | The members change values the game already has. |
new-behaviour | The members add behaviour the game does not have. |
Published values
| name | value | what it is |
|---|---|---|
PACK_FORMAT | s2u-pack | The manifest's format. |
PACK_FORMAT_VERSION | 2 | The manifest's formatVersion. |
PACK_MANIFEST_FILE | s2u-pack.json | The manifest's file name at the pack's root. |
ENGINE_CONTRACT_VERSION | 0.1.1 | The engine contract version this build publishes; a pack's contract range must include it. |
PACK_TARGET_US | SCUS-97275 | The disc revision this build targets (the US disc's product code); a pack's target must be exactly this. |
RULES_PACK_CONTRACT_FLOOR | 0.1.1 | The first engine contract with the rules vocabulary. A rules pack's contract must start at it or above in every || alternative; it stays the same when the build's contract moves on. |
THUNDERSTORE_TEAM_PLACEHOLDER | TEAM_PLACEHOLDER | A stand-in for the Thunderstore team packs would publish under, used in exported dependency pins. It is not a real team: the team is not named yet. |
Target aliases
| earlier spelling | canonical target | what it is |
|---|---|---|
socom2-us-r0001 | SCUS-97275 | The s2u-mod v1 spelling of the target. Only the mod adapter accepts it; in a v2 manifest it is refused and the finding names the canonical target. |