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.

Contract schemas
DocumentFormat idUsed forDownload
Manifestmyrlin.asset-manifest/1The batch input, in lint, quote and submit.manifest.schema.json
Batch resultmyrlin.asset-batch-result/1result.json, and the copy inside the ZIP.batch-result.schema.json
Reviewmyrlin.asset-review/1The 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.

Top level manifest fields
FieldRule
manifestIdStable 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.
revisionInteger from 1. Raise it when the content changes.
projectname (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.
targetsOne 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.
namespaceThe Minecraft mod id. Every Minecraft output path sits under assets/<namespace>/ unless a file names another namespace on purpose.
styleA summary and a palette of 1 to 16 colours; optional shape language, materials, palette sets and references.
assetsAt 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.

manifest.json (free: emits one JSON file)
{
  "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

Manifest and input limits
WhatLimit
One manifest, in one batch8 MB, 25,000 files, 4,000 compute units
A larger manifest, where streamlining is onup 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 ZIP32 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 input16,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.

_inputs.json
{
  "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.