HELIX Docs
CLI & AI tools

Publish a wearable

Upload a garment or accessory from a .glb with helix item publish — the Character-Creator slot and gender are required, and the server verifies the mesh inline.

A wearable is a universal item worn on a character: a jacket, a pair of shoes, a hat, a chain. Publishing one is nothing like publishing a world — there is no bundle, no manifest and no build. One .glb goes up in a single request, the server verifies the mesh inline, and the response carries the created item together with that verdict.

helix item publish jacket.glb \
  --title "Neon Racer Jacket" \
  --slot Cosmetic.Slot.Clothing.Top \
  --gender male,female \
  --price-lix 1200

A wearable must declare its slot and its gender

The Character-Creator cosmetic slot decides where the garment sits on the body; the gender says which body it is authored for. A wearable missing either cannot be equipped or exported, so the platform refuses to store it — --slot and --gender are both required for --kind wearable, and both are matched exactly, including case.

Find the slot tag

helix item list-slots

Tags are grouped into five families. Pass one verbatim:

GroupWhat lives thereExamples
Clothingwearable garmentsCosmetic.Slot.Clothing.Top, …Clothing.Bottoms, …Clothing.Set, …Clothing.Shoes
Accessoryprops attached at a body zoneCosmetic.Slot.Accessory.Head.Hat, …Accessory.Face.Eyewear, …Accessory.Hands.Gloves
Appearancenon-mesh visual layersCosmetic.Slot.Appearance.Hair.Main, …Appearance.Eyes.Eyebrows, …Appearance.Makeup.Lipstick
Bodymodular base meshesCosmetic.Slot.Body.Head, …Body.Upper, …Body.Feet
Customa full-body mesh that overrides the modular bodyCosmetic.Slot.Custom

Cosmetic.Slot.Clothing.Set is a full outfit — it typically hides the Top and Bottoms slots rather than stacking with them.

Pick the gender

--gender says which Character-Creator body the garment is authored for. There are exactly two values, both lowercase:

--genderWhat it means
maleauthored for the male body only
femaleauthored for the female body only
male,femaleone asset that serves both bodies

There is no “unisex”

No all, no both, no neutral, no none. A garment that fits everyone declares every gender it fits — --gender male,female is the "fits everyone" value, and the CLI rejects the invented ones by name before anything is uploaded.

This is not an oversight. Unreal's character-creator cosmetics enum has exactly Male and Female, and a UE cosmetics entry has one mesh field — so a cross-gender garment is authored there as two entries sharing one mesh. The HELIX web runtime ships one .glb worn by every body, so one item row naming both genders is the same statement, made once.

Order does not matter: --gender female,male and --gender male,female publish the identical value. Gender is metadata and a catalog filter — it is not an equip gate, and nothing refuses to put a garment on a character because of it.

helix item list-slots prints the genders alongside the slot tags.

Publish it

Export a binary glTF. A .gltf is a JSON document whose buffers and textures live in sibling files, so it cannot be uploaded as one part — export (or pack) it as .glb.

Dry-run it. --dry-run validates the mesh, the slot, the gender and every field locally and prints exactly what would be sent. Nothing is uploaded and nothing is charged.

helix item publish jacket.glb \
  --title "Neon Racer Jacket" \
  --slot Cosmetic.Slot.Clothing.Top \
  --gender male,female \
  --price-lix 1200 \
  --dry-run
✔ Dry run — nothing uploaded, no fee charged.
  POST /api/v1/universal-items/upload
  mesh:      jacket.glb (4.0 KiB, model/gltf-binary)
  thumbnail: (none — server-rendered)
  payload:   {
               "kind": "wearable",
               "title": "Neon Racer Jacket",
               "slot": "Cosmetic.Slot.Clothing.Top",
               "genders": [
                 "male",
                 "female"
               ],
               "priceLix": 1200
             }

Sign in, if you have not already — helix login opens the browser sign-in and stores a client token in ~/.helix/credentials.json.

Publish, then read the verification warnings the server returns. They are measurements to check against your intent, not failures.

Options

Prop

Type

Pick the money option deliberately

--price-lix and --personal are mutually exclusive, and one of them is required. Publishing to the marketplace charges a non-refundable publish fee in LIX, so the CLI will not infer that intent from an omitted flag. The exact fee and the minimum price are per-kind platform settings — the server states both in its rejection if you get them wrong.

Garment or accessory — the server can tell you

The verification pass distinguishes the two shapes a wearable comes in, and reports the difference as a warning, never a rejection:

  • A skinned garment (a hoodie, cargo pants) deforms with the body. It must be skinned to the HELIX humanoid rig; skinned to some other skeleton, it binds to nothing.
  • A rigid accessory (a hat, glasses, a bag) is a static mesh parented to a socket and legitimately has no skeleton at all.

The item kind alone cannot tell them apart, so a missing skeleton is reported rather than refused — which is correct for a hat and is the bug you are looking for on a hoodie. Convert a raw Meshy/Mixamo rig with helix character import.

Avatars and home items

The same command publishes the other uploadable kinds:

helix item publish sofa.glb --kind home_item --title "Modular Sofa" --price-lix 1500
helix item publish hero.glb --kind avatar --title "Cyber Runner" \
  --slot Cosmetic.Slot.Custom --gender female --thumbnail hero.png --price-lix 2500

An avatar may carry a slot (Cosmetic.Slot.Body.* for a modular base mesh, or Cosmetic.Slot.Custom for a full-body mesh that overrides the modular body) and a --gender, and must supply a --thumbnail — the platform renders one from the mesh for the other kinds, but does not assume a 3D renderer in production. A home item or home shell may carry neither a cosmetic slot nor a gender; both are meaningless on a piece of furniture and are rejected rather than silently stored.

--kind--slot--gender
wearablerequiredrequired
avataroptionaloptional
home_item, home_shellrejectedrejected

From an AI agent

Everything above is available through the MCP server as publish_item, with list_cosmetic_slots returning the same grouped tag list and the same genders. Both slot and genders are closed enumerations there, so an agent cannot invent a tag or a gender.

On this page