> ## Documentation Index
> Fetch the complete documentation index at: https://docs.exclusivo.one/llms.txt
> Use this file to discover all available pages before exploring further.

# Artwork and metadata

> Where your files live, what metadata has to look like, and what breaks images.

## Where your files go

| Chain  | Storage |
| ------ | ------- |
| Solana | Arweave |
| EVM    | IPFS    |

Both are permanent by design, and neither can be edited in place. Updating
artwork means uploading again and pointing at the new copy — not changing the
old one.

## Solana metadata

We normalise your metadata on the way in and check it before anything reaches
the chain, so a malformed file is caught before you've paid to deploy it.

```json What it should look like theme={"system"}
{
  "name": "Collection #1",
  "symbol": "COLL",
  "description": "…",
  "image": "https://arweave.net/…",
  "attributes": [
    { "trait_type": "Background", "value": "Sunset" },
    { "trait_type": "Eyes", "value": "Laser" }
  ],
  "properties": {
    "files": [{ "uri": "https://arweave.net/…", "type": "image/png" }],
    "category": "image"
  }
}
```

Three things account for most rejections:

<AccordionGroup>
  <Accordion title="No properties.files">
    Wallets and indexers read the real image location from here, not from `image`
    on its own. It has to be there.
  </Accordion>

  <Accordion title="No category">
    It belongs at the top of `properties`, and leaving it out is the single most
    common failure.
  </Accordion>

  <Accordion title="Attributes in the wrong shape">
    A flat list of `{ trait_type, value }` objects. Not a nested object, not a
    map keyed by trait name.
  </Accordion>
</AccordionGroup>

<Tip>
  Run `npm run check:launch` against a draft to validate everything before you
  spend gas.
</Tip>

## EVM metadata

Your metadata is pinned as a directory and the contract stores the address of
that directory. Token 5 resolves to item 5 inside it.

Because of that, you can't change one item's artwork on its own. Updating
artwork re-pins the whole directory and points the contract at the new one —
which is also exactly how a delayed reveal works.

## When images don't show up

Images are served through our own proxy rather than hot-linked from a storage
gateway, which is generally more reliable.

If your images resolve in the metadata JSON but not in the app, look at the
actual `src` of the broken image in your browser's inspector. A URL that has
been passed through the proxy twice looks perfectly fine in the metadata and
broken on the page.

<Warning>
  Never paste a **signed** storage URL into a field that gets saved — a collection
  logo, a banner. Those links expire, often after a week, and when they do the
  image simply vanishes with nothing to explain it. Upload the file properly.
</Warning>

## Refreshing metadata

Both chains can refresh metadata from `/mint/manage` after launch. That re-reads
your metadata and updates what we show — it doesn't change what's on-chain. For
that you need an artwork update.
