Manifest format
A manifest is one JSON document that lists every asset a mod job needs, in each representation the game uses, down to the exact output path of every file.
Format and schemas
The format id is myrlin.asset-manifest/1, contract minor 1.5. The schema is a JSON Schema file you can validate against before you send anything. The result and the review have schemas too.
| Document | Format id | Used for | Download |
|---|---|---|---|
| Manifest | myrlin.asset-manifest/1 | The batch input, in lint, quote and submit. | manifest.schema.json |
| Batch result | myrlin.asset-batch-result/1 | result.json, and the copy inside the ZIP. | batch-result.schema.json |
| Review | myrlin.asset-review/1 | The body of POST /projects/{slug}/reviews. | review.schema.json |
Forge conforms to these schemas; they are owned by the Mod Works side of the pipeline. The $id inside each file names an address this site does not serve, so validate with the downloaded file. GET /capabilities returns the accepted format ids and the current limits as data.
Shape
The top level needs schema, manifestId, revision, project, targets, style and assets. Unknown fields are refused.
| Field | Rule |
|---|---|
manifestId | Stable id across revisions: lowercase letters, digits, dot, underscore or hyphen, 3 to 64 characters, starting with a letter or digit. A quote is pinned to the manifest id, the revision and the hash of the canonical JSON. |
revision | Integer from 1. Raise it when the content changes. |
project | name (required, up to 255 characters) and slug (required, 1 to 48 of a-z 0-9 _). The slug must equal the project in the URL. |
targets | One to four different profiles, for example mc-26.1-neoforge, mc-1.21.1-neoforge, mc-1.21.1-fabric or hytale-0.6.8, with at most one Minecraft profile per manifest. A Minecraft profile and a Hytale profile together mean the job wants both games. |
namespace | The Minecraft mod id. Every Minecraft output path sits under assets/<namespace>/ unless a file names another namespace on purpose. |
style | A summary and a palette of 1 to 16 colours; optional shape language, materials, palette sets and references. |
assets | At least one asset. |
Each asset has an id, a kind, a status, an action and one or more representations. A representation has an id, a role and one or more files. Each file has an output path and a format. describe says what to make in plain words and is required when the action is generate.
{
"schema": "myrlin.asset-manifest/1",
"manifestId": "example-pack",
"revision": 1,
"project": {
"name": "Example pack",
"slug": "example_pack"
},
"namespace": "examplemod",
"targets": [
"mc-26.1-neoforge"
],
"style": {
"summary": "Plain test palette",
"palette": [
{
"role": "ink",
"color": "#000000"
}
]
},
"assets": [
{
"id": "definitions",
"name": "Definitions",
"kind": "other",
"status": "missing",
"action": "generate",
"describe": "Emit the declared JSON.",
"representations": [
{
"id": "definitions",
"role": "other",
"files": [
{
"path": "assets/examplemod/data/example.json",
"format": "json",
"action": "emit",
"content": {
"answer": 42
}
}
]
}
]
}
]
}This manifest passes the schema check. Replace content to change what the emitted file holds.
File actions and formats
A file's action is one of generate, copy, exists, emit, derive. A file with a derive block has the action derive; the block names a rule and the source files in from. The rules are frame0_crop, palette_swap, recolour_ramp, greyscale_for_tint, strip_assemble, mask_bucket, hytale_export, audio_transcode, model_import, hytale_support, model_resize, file_restore.
The format is one of png, png.mcmeta, json, ogg, bbmodel, geo.json, animation.json, blockymodel, blockyanim, particlesystem, particlespawner, trail, ui, lang, txt, obj, mtl.
An output path is the exact path inside the delivered ZIP. Minecraft paths are assets/<namespace>/.... Minecraft authoring sources (.bbmodel, .json, .png or .txt files) may go under authoring/<namespace>/...: they are delivered with the job but never installed into the mod's resources or shipped. Hytale paths start with Common/ or Server/, or are the pack's manifest.json. A Hytale UI picture may also have a double density copy whose name ends in @2x.png, under Common/ only. A path is at most 240 characters.
Files that the server can generate by lane today: art_generated for png; model_generated for bbmodel, geo.json, animation.json, blockymodel, blockyanim; sound_generated for ogg. Whether a lane is on is reported by GET /pricing. See Pricing per lane.
Asset kinds and roles
An asset kind is one of item, tool, weapon, armor_piece, armor_layer, overlay, block, block_entity, fluid, entity, projectile, particle, sound_event, gui_screen, gui_sprite, mob_effect, advancement_icon, book, lang, texture, other.
A representation role is one of inventory_icon, held, ground, fixed, head, on_shelf, item_definition, item_model, overlay_layer, tint_layer, emissive_layer, animation_meta, block_state, block_model, block_face, block_item, block_entity_renderer, equipment_definition, worn_layer, entity_model, entity_texture, entity_animation, spawn_egg, projectile_texture, fluid_still, fluid_flowing, fluid_camera, fluid_definition, fluid_bucket, particle_definition, particle_sprite, sound_file, sound_definition, gui_background, gui_sprite, mob_effect_icon, advancement_icon, book_page, book_image, lang_entry, atlas_source, hytale_model, hytale_texture, hytale_icon, hytale_item_definition, hytale_block_definition, hytale_block_texture, hytale_animation, hytale_item_animations, hytale_interaction, hytale_particle_system, hytale_particle_spawner, hytale_particle_sprite, hytale_trail, hytale_sound_event, hytale_ui_page, hytale_lang, hytale_npc_role, hytale_pack_manifest, other.
Limits
| What | Limit |
|---|---|
| One manifest, in one batch | 8 MB, 25,000 files, 4,000 compute units |
| A larger manifest, where streamlining is on | up to 64 MB, 200,000 files and 32,000 compute units. Forge splits it into at most 128 child batches, listed in children on the batch. |
| An input ZIP | 32 MB, at most 30,000 entries, 8 MB per entry and 256 MB expanded. Stored or deflated entries only, files only, safe relative paths. |
| A PNG input | 16,384 pixels a side and 4,194,304 pixels in all |
Use POST /lint to see every problem before you quote. Each issue has a severity (error blocks the batch, warning is shown in the quote), a stable code, a message and a where pointer such as assets[3].representations[0].files[1] or an output path.
Input files and rights
Upload reference art and sources as one ZIP with POST /projects/{slug}/inputs, then pass the returned inputSetId to lint, quote and submit. Put rights next to the files in an _inputs.json at the top of the ZIP. It accepts files, rights, license, source and attribution. Top-level values are defaults; files overrides them per input path.
{
"rights": "licensed",
"license": "MIT",
"source": "Declared source",
"files": {
"analysis/reference.png": { "rights": "analysis-only" }
}
}rights is one of original, licensed, analysis-only, ARR, ND or code-only. Copying or deriving a file needs original, or licensed with a license string. analysis-only, ARR, ND and code-only inputs may inform a generated file but cannot supply copied or derived bytes. A restrictive license wins over a contradictory rights value. Rights are what you declare. Forge enforces the declaration, and it cannot check that it is true.