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 1200A 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-slotsTags are grouped into five families. Pass one verbatim:
| Group | What lives there | Examples |
|---|---|---|
Clothing | wearable garments | Cosmetic.Slot.Clothing.Top, …Clothing.Bottoms, …Clothing.Set, …Clothing.Shoes |
Accessory | props attached at a body zone | Cosmetic.Slot.Accessory.Head.Hat, …Accessory.Face.Eyewear, …Accessory.Hands.Gloves |
Appearance | non-mesh visual layers | Cosmetic.Slot.Appearance.Hair.Main, …Appearance.Eyes.Eyebrows, …Appearance.Makeup.Lipstick |
Body | modular base meshes | Cosmetic.Slot.Body.Head, …Body.Upper, …Body.Feet |
Custom | a full-body mesh that overrides the modular body | Cosmetic.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:
--gender | What it means |
|---|---|
male | authored for the male body only |
female | authored for the female body only |
male,female | one 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 2500An 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 |
|---|---|---|
wearable | required | required |
avatar | optional | optional |
home_item, home_shell | rejected | rejected |
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.