{
  "schemaVersion": "1.0",
  "canonical": "https://superlumin.al/docs/market/product-packaging",
  "representations": {
    "html": "https://superlumin.al/docs/market/product-packaging",
    "markdown": "https://superlumin.al/docs/market/product-packaging.md",
    "json": "https://superlumin.al/docs/market/product-packaging.json"
  },
  "retrievalHint": "Read page.description and page.relatedArticles first, then page.body. page.images lists every documentation screenshot with alt text, dimensions, captions, and annotations.",
  "page": {
    "path": "/docs/market/product-packaging",
    "title": "Package products for delivery",
    "description": "Prepare Blender extensions and asset libraries so Sulu Market can process them: manifest rules, asset marking, catalogs, previews, and packing.",
    "navTitle": "Product packaging",
    "section": "Sulu Market",
    "sectionOrder": 40,
    "order": 5,
    "hidden": false,
    "keywords": [
      "blender_manifest.toml",
      "asset library zip",
      "blender_assets.cats.txt",
      "mark as asset",
      "pack resources",
      "extension packaging",
      "catalogs"
    ],
    "updated": "2026-08-04",
    "body": "How you package a product decides how buyers receive it. Ordinary file products deliver as downloads. The two Blender-native delivery kinds go further: Sulu Market processes and validates them so they flow straight into buyers' Blender installations. Extensions deliver through the [extensions repository](/docs/market/library#set-up-the-sulu-extensions-repository-in-blender), and assets through the [online asset library](/docs/market/library#set-up-the-sulu-asset-library-in-blender). This page is the packaging contract for both.\n\n## Blender extensions\n\nUpload a standard Blender extension archive: the same ZIP produced by Blender's extension tooling (for example `blender --command extension build` from your source directory).\n\nWhat the pipeline enforces:\n\n- The archive must contain exactly **one** `blender_manifest.toml`. The pipeline rejects archives with zero or multiple manifests.\n- The manifest's **`id` is permanent**: it becomes the product's immutable extension identity, and every later version must keep the same `id`.\n- The manifest **`version` must match the product version** you attach the archive to.\n- Fill the standard manifest fields Blender requires: `schema_version`, `id`, `version`, `name`, `tagline`, `maintainer`, `license`, and `blender_version_min` (plus `blender_version_max`, `tags`, `website`, `copyright`, and `permissions` where relevant).\n- If the extension ships native code or Python dependencies, declare `platforms` and bundle `wheels`. Buyers only see builds for their platform.\n- The server re-validates every archive with pinned Blender 5.2 tooling and normalizes it before it can be published. A manifest that Blender itself would reject never reaches buyers.\n\n### Test the artifact, not the source tree\n\nInstall the exact built ZIP through **Install from Disk** in a factory-startup Blender before uploading. What you test is byte-for-byte what buyers receive after review.\n\n## Blender assets and asset libraries\n\nAsset products accept two source shapes, and the processing pipeline turns either into entries in every buyer's remote asset library:\n\n### Single .blend\n\nOne `.blend` file containing your marked assets. Everything the assets reference must live inside the file: run **File → External Data → Pack Resources** before you save. The pipeline rejects the upload with an external-dependency error if it finds even one external reference (an unpacked texture, a linked library, a cache on disk).\n\n### Asset-library ZIP\n\nA ZIP with the standard Blender asset-library layout:\n\n- one or more `.blend` files (subfolders are allowed)\n- exactly one `blender_assets.cats.txt` catalog map at the archive root\n- optionally the textures those blends reference, as ordinary image files (`.png`, `.jpg`, `.exr`, `.hdr`, `.tif`, `.tga`, `.webp`, `.bmp`, `.dds`)\n\nNothing else is allowed in the archive: no scripts, no executables, no archives-in-archives, no symlinks, at most 2048 entries. This is the same folder structure Blender itself uses for a local asset library, zipped.\n\n### Mark the assets\n\nThe pipeline publishes only data-blocks explicitly **marked as assets**. Everything else in the file counts as supporting data. In Blender, right-click the object, material, node group, world, or other data-block and choose **Mark as Asset**. Use Blender's stock asset types. The pipeline rejects types that require Blender's experimental extended-asset-browser flag.\n\n### Organize with catalogs\n\nBuyers browse your product by its catalogs, so assign every asset to one in Blender's Asset Browser catalog tree. In a ZIP bundle, each asset's catalog must exist in the root `blender_assets.cats.txt`. The pipeline rejects an asset whose catalog is missing from the map. On the buyer side, catalogs stay separate per product, so your names never collide with other sellers' catalogs.\n\n### Previews and metadata\n\nEvery asset needs a preview: the one Blender generated when you marked it, a custom preview you loaded, or the automatic render the processor generates when none is stored. Author the asset metadata in Blender's asset details panel. **Description, author, license, copyright, and tags** all carry through to what buyers see in their Asset Browser.\n\n### Compatibility\n\nAsset processing currently runs pinned Blender 5.2, and the resulting library entries report Blender 5.2 compatibility to buyers. Save your source files with a 5.2-compatible feature set.\n\n## Verify like a buyer\n\n### Process and publish\n\nUpload the source to the product version and let processing finish. The version's delivery state shows when the artifacts are ready.\n\n### Set up the buyer integrations\n\nIn a clean Blender profile, add your own [asset library](/docs/market/library#set-up-the-sulu-asset-library-in-blender) or [extensions repository](/docs/market/library#set-up-the-sulu-extensions-repository-in-blender).\n\n### Check the buyer experience\n\nConfirm previews, catalog structure, names, and metadata read the way you intended, install or import into an empty scene, and render.\n\n- [Selling](/docs/market/selling): Storefront setup, listings, orders, payouts, and publishing.\n- [Buyer setup](/docs/market/library): How buyers connect the asset library and extensions repository.\n- [Seller terms](/legal/seller): The current policy for eligibility, fees, and listing requirements.",
    "images": [],
    "machineReadable": {
      "markdown": "/docs/market/product-packaging.md",
      "json": "/docs/market/product-packaging.json"
    },
    "internalLinks": [
      "/docs/market/library",
      "/docs/market/library",
      "/docs/market/library",
      "/docs/market/library",
      "/docs/market/selling",
      "/docs/market/library",
      "/legal/seller"
    ],
    "readingTime": "4 min read",
    "toc": [
      {
        "id": "blender-extensions",
        "title": "Blender extensions",
        "level": 2
      },
      {
        "id": "test-the-artifact-not-the-source-tree",
        "title": "Test the artifact, not the source tree",
        "level": 3
      },
      {
        "id": "blender-assets-and-asset-libraries",
        "title": "Blender assets and asset libraries",
        "level": 2
      },
      {
        "id": "single-blend",
        "title": "Single .blend",
        "level": 3
      },
      {
        "id": "asset-library-zip",
        "title": "Asset-library ZIP",
        "level": 3
      },
      {
        "id": "mark-the-assets",
        "title": "Mark the assets",
        "level": 3
      },
      {
        "id": "organize-with-catalogs",
        "title": "Organize with catalogs",
        "level": 3
      },
      {
        "id": "previews-and-metadata",
        "title": "Previews and metadata",
        "level": 3
      },
      {
        "id": "compatibility",
        "title": "Compatibility",
        "level": 3
      },
      {
        "id": "verify-like-a-buyer",
        "title": "Verify like a buyer",
        "level": 2
      },
      {
        "id": "process-and-publish",
        "title": "Process and publish",
        "level": 3
      },
      {
        "id": "set-up-the-buyer-integrations",
        "title": "Set up the buyer integrations",
        "level": 3
      },
      {
        "id": "check-the-buyer-experience",
        "title": "Check the buyer experience",
        "level": 3
      }
    ],
    "wordCount": 807,
    "relatedArticles": [
      {
        "path": "/addons",
        "title": "Add-ons on render nodes",
        "description": "Select the Blender add-ons that affect a render. Superluminal packages their files, uploads them with the project, and enables them on each render node."
      },
      {
        "path": "/dependencies",
        "title": "Blender project dependencies",
        "description": "Before upload, Superluminal checks textures, linked Blender files, UDIMs, sequences, caches, fonts, and other external inputs."
      },
      {
        "path": "/compatibility/render-engines",
        "title": "Blender render engine compatibility",
        "description": "Superluminal renders Cycles and EEVEE image sequences with Blender 4.0 through 5.2. Choose the farm version and output format before submission."
      }
    ]
  }
}
