# Welcome

Everything you need to know to show up, hang out, and be part of Decentraland.

### 🌟 Getting Started

* [Getting started with Decentraland](/in-world/overview)
* [Finding and attending events](/in-world/finding-events)
* [Making friends and chatting](/in-world/friends-and-chatting)
* [Customizing your avatar](/in-world/customizing-your-avatar)
* [Earning rewards](/in-world/earning-rewards)
* [Exploring Genesis City and Worlds](/in-world/exploring)
* [Settings and performance optimization](/in-world/settings-and-performance)
* [Account management](https://docs.decentraland.org/faqs/my-account) and [security](/faqs/security)

### ❓ Learn About Decentraland

* [About Decentraland](/introduction/about-decentraland)
* [Whitepapers](/introduction/whitepaper)
* [FAQs](/faqs/decentraland-101)

### 🔑 Own and Manage

* [Buying and selling LAND, Wearables, and Emotes](/marketplace/marketplace)
* [Managing your LAND parcels and Estates](/marketplace/land-manager)
* [Renting LAND](/marketplace/rentals)

### 🎨 Create

* [Creating content and monetizing your work](https://docs.decentraland.org/creator)
* [Creating Wearables](https://docs.decentraland.org/creator/wearables-and-emotes/wearables/creating-wearables)
* [Creating Emotes](https://docs.decentraland.org/creator/wearables-and-emotes/emotes/creating-emotes)
* [Creating Scenes](https://docs.decentraland.org/creator/scene-editor/get-started/scene-editor-essentials)

### 🏛️ The Community & Governance

* [How to participate in the DAO](/dao/dao-userguide)
* [Understanding voting power](/dao/dao/what-do-you-need-to-participate)
* [Creating and voting on proposals](/dao/dao/what-can-you-do-with-the-dao)
* [The DAO's structure and limitations](/dao/dao/the-daos-limitations)

### 🔗 Blockchain & Wallets

* [Setting up your wallet](/blockchain-integration/get-a-wallet)
* [Understanding Ethereum and smart contracts](/blockchain-integration/ethereum-essentials)
* [Managing transactions in Polygon](/blockchain-integration/transactions-in-polygon)

### Quick Links

* [Download Decentraland](https://decentraland.org/download/)
* [Visit the Marketplace](https://decentraland.org/marketplace)
* [Join the DAO](https://decentraland.org/dao)
* [Explore Events](https://decentraland.org/events/)

## Community

* [Discord](https://dcl.gg/discord) - Join the conversation
* [Forum](https://forum.decentraland.org/) - Discuss proposals and ideas
* [X](https://X.com/decentraland) - Stay updated with news
* [Newsletter](https://decentraland.beehiiv.com/subscribe) - Weekly updates

***

Need Help? [Contact Support](https://decentraland.org/help/)


# About Decentraland

General Overview about Decentraland

Welcome to Decentraland.

<details>

<summary>What is Decentraland?</summary>

Decentraland is where you hang out online. Every week you'll find movie screenings, live music, streaming parties, campfire hangouts and other community meetups—the kind of experiences where familiar faces keep showing up and newcomers always find their crowd. Founded in 2015 and publicly launched in 2020, Decentraland is a community-driven virtual space supported by the non-profit Decentraland Foundation and guided by its users through transparent governance. Everything in Decentraland is built and owned by the people who show up: the parcels, the scenes, the avatars, and the experiences. The infrastructure is decentralized, so no single company can take away your space, your identity, or what you've built. Decentraland is available as a high-fidelity desktop app and as a [mobile app](/mobile-app/mobile-app) on [iOS](https://apps.apple.com/app/decentraland/id6478403840?utm_source=docs\&utm_medium=internal\&utm_content=ios) and [Android](https://play.google.com/store/apps/details?id=org.decentraland.godotexplorer\&pcampaignid=web_share\&utm_source=docs\&utm_medium=internal\&utm_content=android). Come hang out at [decentraland.org](https://decentraland.org/)

</details>

<details>

<summary>What can I do in Decentraland?</summary>

* **Show Up for What's Happening**: Every week there are screenings, game nights, and other [community events](https://decentraland.org/events/). Come for one and stay because your people are there.
* **Connect**: Meet people from around the world. The regulars become your crowd. Show up enough times and you'll recognize faces.
* **Express Yourself**: Customize your avatar with community-designed Wearables and Emotes. Make it look like you, or whoever you want to be.
* **Build and Own**: Claim [your own virtual space](https://decentraland.org/blog/about-decentraland/decentraland-worlds-your-own-virtual-space) with LAND or a World. Create a venue, a game, an art installation, or anything else you can imagine. It's yours.
* **Earn and Trade**: Create Wearables and Emotes, sell them in the [Marketplace](https://decentraland.org/marketplace), and keep 97.5% of your earnings—one of the highest revenue shares in the industry. Trade digital assets with the community and build something of value.
* **Shape What Happens Next**: You're part of a community that decides the platform's direction. Through the [DAO](https://decentraland.org/dao), you can propose changes, vote on initiatives, and contribute to projects that matter to you.

</details>

<details>

<summary>Is Decentraland free?</summary>

Yes. You can explore, connect with the community, and attend events without spending anything. Show up and complete weekly in-world goals to earn [Marketplace Credits](https://decentraland.org/blog/announcements/marketplace-credits-earn-weekly-rewards-to-power-up-your-look), which you can spend on community-made Wearables, Emotes, and NAMEs, or use to publish your own creations. If you want to buy something right away, you can pay with a credit card or crypto. There's no barrier to showing up.

</details>

<details>

<summary>Decentraland is community-driven—what does that mean?</summary>

Decentraland belongs to the people who use it. There's no central company controlling the platform or deciding what happens next—that's all decided by the community through the DAO.

The content you see, from the builds on LAND to the Wearables in the [Marketplace](https://decentraland.org/marketplace), is created by the community. [Events](https://decentraland.org/events) happen because members organize them. The platform evolves based on what the community votes for. This isn't just rhetoric. Decentraland's code is open source, its content is stored on a distributed network, and it can never be shut down by a single company.

The economy is designed to support creators first. 2.5% of all Marketplace sales fund community initiatives through the DAO, while creators keep the rest. Anyone can submit an event, build something, or contribute to the world's future.

</details>

<details>

<summary>How was Decentraland started?</summary>

The idea for Decentraland started in 2015 with a simple question: what if you could actually own your digital space? In 2020, it officially launched as the world's first fully decentralized virtual world. Since then, it's become a place where you show up, hang out with people, and come back because something's always happening. Today, thousands of creators and community members shape what Decentraland becomes.

Learn more [White Paper 1.0](https://decentraland.org/whitepaper.pdf) | [White Paper 2.0](https://decentraland.org/whitepaper2.pdf)

</details>

<details>

<summary>What is Decentraland DAO?</summary>

The [Decentraland DAO](https://decentraland.org/dao) (Decentralized Autonomous Organization) is how you shape Decentraland's future. You can propose and vote on decisions that matter, from policy changes to updates on how the Marketplace works. If you own MANA, LAND, or NAMEs, you have voting power.

The DAO controls the smart contracts that power Decentraland: LAND, Estates, and the Marketplace. That's what makes Decentraland genuinely decentralized—your community controls what matters most. Your votes decide how the economy works and what gets built.

The DAO also manages Decentraland's treasury, funding community-driven initiatives, events, and development.

</details>

<details>

<summary>What is Regenesis Labs?</summary>

[Regenesis Labs](https://decentraland.org/blog/announcements/introducing-dcl-regenesis-labs) is the execution arm of the DAO. It's the team that turns community decisions into real delivery: hiring globally, signing contracts, and coordinating long-term projects on behalf of the community, all aligned with what you vote for. The DAO debates and decides; Regenesis Labs makes it happen. Right now, that includes [building Decentraland's mobile client](https://decentraland.org/blog/announcements/mobile-the-next-chapter-for-decentraland), bringing the experience to where you already spend your time.

</details>

<details>

<summary>What is Decentraland Foundation?</summary>

Decentraland Foundation builds and maintains the software that makes Decentraland run. Every week, people show up to movie screenings, live music, and other [community meetups](https://decentraland.org/events/)—the kind of immersive social hangouts you don't find elsewhere on the internet—and the Foundation's job is to make sure the infrastructure behind all of it is solid, secure, and open. That means contributing to the platform's codebase, maintaining smart contract security, protecting the community from scams and misinformation, and stewarding the Decentraland brand.

</details>


# Whitepapers

Read more about the philosophy and design of Decentraland in our white paper.

## White Paper 2.0 (2024)

With 7 years passed since the original white paper's publishing, a new white paper was published in 2024 as part of the 'Decentraland 2.0' movement, which involved the release of an entirely new desktop client for Decentraland, integrating the learnings gathered since the platform's original launch in 2020. Serving as a guide for both veterans and newcomers, this document expands on the need for decentralized technology and reaffirms Decentraland's mission, documents its history, evolution, and impact since release, details its technological architecture, and lays out the roadmap planned for its continued development.

[Read Decentraland's 2024 white paper 2.0 here](https://decentraland.org/whitepaper2.pdf)

## Original White Paper (2017)

Decentraland's original white paper was published in 2017, 3 years before the platform would launch to the public. It was written by Decentraland founders Esteban Ordano, Ariel Meilich, Yemel Jardi, and Manuel Araoz. This white paper presents a detailed explanation of the original philosophical motivations behind the Decentraland project, along with a rigorous discussion of the proposed technical and economic approaches to building Decentraland.

[Read Decentraland's original 2017 white paper here](https://decentraland.org/whitepaper.pdf)


# Decentraland on Mobile

Decentraland on iOS and Android.

Decentraland is now available on mobile. You can hang out, attend events, explore Genesis City, and visit Worlds from your phone — wherever you are.

![Decentraland mobile app — Genesis City](/files/vgB3xXzfnSuzc4g3l4Vg)

## Get the app

* [Download for iOS (App Store)](https://apps.apple.com/app/decentraland/id6478403840?utm_source=docs\&utm_medium=internal\&utm_content=ios)
* [Download for Android (Google Play)](https://play.google.com/store/apps/details?id=org.decentraland.godotexplorer\&pcampaignid=web_share\&utm_source=docs\&utm_medium=internal\&utm_content=android)

{% hint style="warning" %}
**UK users:** the iOS and Android apps are not currently available in the United Kingdom due to [Crypto Gaming Regulations](https://www.fca.org.uk/firms/cryptoassets-information).
{% endhint %}

## In this section

* [Getting started](/mobile-app/getting-started) — first-time setup, sign-in, and finding your first place to hang out.
* [Controls](/mobile-app/controls) — how to move, interact, chat, and use the camera with touch.
* [Troubleshooting](/mobile-app/troubleshooting) — common issues and where to get help.

## What you can do on mobile

* Explore Genesis City and visit Worlds
* Show up to live events with the rest of the community
* Customize your avatar
* Chat with friends and people you meet in the world
* Use the same account, inventory, and progress as on desktop

## What's different from desktop

The mobile app is designed for touch and one-handed use. The on-screen controls — joystick, interaction button, camera, chat — replace the keyboard and mouse, but the world and your account are the same. Some scenes that were originally designed for desktop may not yet be optimized for mobile; creators are actively updating their content.

## Related

* [About Decentraland](/introduction/about-decentraland)
* [In-World Overview](/in-world/overview)


# Getting started

First-time setup for the Decentraland mobile app.

This guide walks you through your first session on the Decentraland mobile app.

## 1. Install the app

Install Decentraland from your phone's app store:

* [App Store (iOS)](https://apps.apple.com/app/decentraland/id6478403840?utm_source=docs\&utm_medium=internal\&utm_content=ios)
* [Google Play (Android)](https://play.google.com/store/apps/details?id=org.decentraland.godotexplorer\&pcampaignid=web_share\&utm_source=docs\&utm_medium=internal\&utm_content=android)

## 2. Sign in

Open the app and sign in. You can use the same account you use on desktop — your avatar, inventory, friends, and progress all come with you.

If this is your first time in Decentraland, you can create a new account from inside the app.

## 3. Customize your avatar

New users are invited to set up an avatar the first time they sign in. Returning users keep the avatar from their existing account. Either way, you can change your look at any time from the profile menu — see [Customizing Your Avatar](/in-world/customizing-your-avatar) for the full guide.

## 4. Choose where to go

The mobile app's **Discover** section is the easiest way to find places to hang out. It surfaces curated scenes and worlds that are designed to work well on mobile, including live events, games, and social spaces.

You can also:

* Search for a specific scene or world by name
* Visit a world by its name (e.g. `myworld.dcl.eth`)
* Jump to a friend's location

## 5. Get moving

Once you're in the world, use the on-screen controls to move and interact. The full reference is in [Controls](/mobile-app/controls).

## Related

* [Controls](/mobile-app/controls)
* [Troubleshooting](/mobile-app/troubleshooting)
* [Customizing Your Avatar](/in-world/customizing-your-avatar)
* [Finding Events](/in-world/finding-events)


# Controls

How to move, interact, chat, and use the camera with touch.

The Decentraland mobile app replaces the keyboard and mouse with on-screen touch controls. Everything you can do on desktop is also possible on mobile, with a different layout designed for one-handed touch use.

<figure><img src="/files/nSUISBldnuu3jhLVLxPN" alt="Mobile in-world HUD with controls labeled"><figcaption><p>The Decentraland mobile app in-world HUD, with each touch control labeled.</p></figcaption></figure>

## Movement

* **On-screen joystick** (left side of the screen) — drag to walk and run in any direction. The further you push the joystick, the faster you move.
* **Camera drag** (anywhere on the right side of the screen) — drag to look around. This rotates your view without moving your avatar.

## Interaction

* **Interaction button** (bottom right) — tap to interact with whatever you're aiming at. This is the equivalent of a pointer click on desktop.
* **Tap on objects** — many things in the world can be tapped directly. If a creator has set up an entity to respond to taps, you'll trigger it the same way you would click on desktop.

## Chat

* **Chat icon** (left side) — tap to open chat. Use it to talk to people nearby or to friends in private messages.

## Profile, search, and emotes

* **Profile** (top right) — open your profile, manage your avatar, and access account settings.
* **Search** (left side) — find scenes, worlds, events, and other players.
* **Emotes** (left side) — trigger emotes to express yourself in front of other players.

## Camera

* **Camera controls** (top right) — switch between first-person and third-person views, and access camera-related options.

## Tips

* You can chat with anyone nearby, even if they're on desktop or web. Everyone shares the same world.
* Long-press on the joystick to keep walking without holding the screen with your thumb (depending on app version).
* If a scene's UI ever feels cramped, the creator may not have updated it for mobile yet — give it a moment, look for an alternate view, or report it from the in-app support menu.

## Related

* [Getting started on mobile](/mobile-app/getting-started)
* [Troubleshooting](/mobile-app/troubleshooting)
* [Shortcuts & Chat Commands](/in-world/shortcuts-and-chat-commands) (desktop reference)


# Troubleshooting

Common issues with the Decentraland mobile app and where to get help.

If something isn't working in the Decentraland mobile app, this page covers the most common situations and where to get more help.

## The app won't sign in

* Make sure you have an internet connection.
* Try closing and re-opening the app.
* If you signed up on desktop and can't find your account, confirm you're using the same sign-in method you used originally.

## A scene won't load or runs slowly

* Some scenes are large and take a moment to download — give it a few moments, especially on cellular networks.
* Try moving to a different scene and back; this resets the load.
* If a specific scene reliably runs slowly, the creator may not have optimized it for mobile yet. You can try it from a Wi-Fi connection or on a more recent device.

## I can't see the on-screen controls

* Make sure you're inside a scene — the controls only show up once you've finished loading.
* Tap once on the screen to wake up the controls if they faded out.

## A scene's UI overlaps the controls

The mobile client reserves the left side and the bottom-right corner of the screen for joystick, chat, profile, and the interaction button. If a scene's own UI overlaps those areas, the creator hasn't yet updated it for mobile — they're working on it.

## Where to get help

* In the bottom right of any [decentraland.org](https://decentraland.org/) page, click the chat icon to reach the Support Team, or go to [decentraland.org/help](https://decentraland.org/help).
* Join the conversation on [Discord](https://dcl.gg/discord) — there are channels dedicated to mobile feedback and support.
* Follow [@decentraland](https://twitter.com/decentraland) on X for status updates.

## Related

* [Getting started](/mobile-app/getting-started)
* [Controls](/mobile-app/controls)
* [Contact & Support](/faqs/contact-and-support)


# Decentraland 101

General Overview about Decentraland

## Getting Started

<details>

<summary>How do I enter Decentraland?</summary>

**On desktop:**

1. The first step is downloading the Decentraland app onto your computer. Go to the download page [here](https://decentraland.org/download?utm_org=dcl\&utm_source=decentraland\&utm_medium=organic\&utm_campaign=evergreen\&utm_term=generaldocs\&utm_content=faq).
2. Once you've successfully installed and loaded Decentraland on your computer, you'll be asked to log into your Decentraland account, a process that happens online, so you can expect a browser window to open.
3. Create and sign into your Decentraland account by connecting your Google or Discord account or another social profile or a digital wallet such as MetaMask or Coinbase. Check out a tutorial for [making an account with a social profile](https://www.youtube.com/watch?v=ylZrPisyPl4) or [with an external wallet like MetaMask](https://www.youtube.com/watch?v=w3CCVrVe1M4).
4. Once online verification is complete, open the Decentraland app window on your computer and click 'Jump Into Decentraland'.
5. You're in! From here you can click on the backpack icon to customize your avatar, run around exploring Decentraland's community-built world, or attend an [event](https://decentraland.org/events?utm_org=dcl\&utm_source=generaldocs\&utm_medium=organic\&utm_content=faq) and make some friends. Have fun!

**On mobile:**

1. Download the Decentraland app from the [App Store (iOS)](https://apps.apple.com/app/decentraland/id6478403840?utm_source=docs\&utm_medium=internal\&utm_content=ios) or [Google Play (Android)](https://play.google.com/store/apps/details?id=org.decentraland.godotexplorer\&pcampaignid=web_share\&utm_source=docs\&utm_medium=internal\&utm_content=android).
2. Open the app and sign into your Decentraland account using your preferred sign-in method — a social profile (Google, Discord, etc.) or a digital wallet. You can use the same account you use on desktop, so your avatar, inventory, friends, and progress all come with you.
3. You're in! See [Getting started on mobile](/mobile-app/getting-started) for a walkthrough of your first session.

</details>

<details>

<summary>Do I need crypto or a digital wallet to use Decentraland?</summary>

No, you do not need to own crypto or already have a digital wallet to use Decentraland. Decentraland is free to use, and if you'd like to purchase something from the [Marketplace](https://market.decentraland.org/), you can use a credit/debit card in addition to cryptocurrency.

See a tutorial for [making an account with a social profile](https://www.youtube.com/watch?v=ylZrPisyPl4) or [with an external wallet like MetaMask](https://www.youtube.com/watch?v=w3CCVrVe1M4).

In Decentraland users truly own their digital assets, such as Wearables or NAMEs, with ownership registered on the blockchain.To enable this, every Decentraland account is linked to a unique digital wallet. However, if you don't already have a digital wallet, you don't need to get one yourself. If you sign into Decentraland with a social account such as Google or Discord, a digital wallet will be made for your account behind the scenes, so you don't have to worry about anything.

</details>

<details>

<summary>What hardware do I need to run Decentraland?</summary>

Decentraland is available on PC (Windows and Mac) and on mobile devices (iOS and Android). The minimum hardware specs for Decentraland to run smoothly are listed below:

**Windows**

|         | Minimum Required                                                          | Recommended Settings                              |
| ------- | ------------------------------------------------------------------------- | ------------------------------------------------- |
| OS      | Windows 10 64-bit                                                         | Windows 11 64-bit                                 |
| CPU     | Intel i5 7th generation or AMD Ryzen 5 Series                             | Intel i7 12th generation or AMD Ryzen 7 Series    |
| GPU     | Nvidia RTX 20 Series or AMD Radeon RX 5000 Series (DirectX 12 compatible) | Nvidia RTX 30 Series or AMD Radeon RX 6000 Series |
| VRAM    | 6 GB                                                                      | 12 GB                                             |
| RAM     | 16GB                                                                      | 32 GB                                             |
| Storage | 8GB HDD                                                                   | 20GB SDD                                          |

**Mac**

|         | Minimum Required                                 | Recommended Settings               |
| ------- | ------------------------------------------------ | ---------------------------------- |
| OS      | macOS 11 Big Sur                                 | macOS 12 Monterey                  |
| CPU     | Apple M1                                         | Apple M1 Pro/M2                    |
| GPU     | Apple M1 integrated GPU (Metal support required) | Apple M1 Pro/M2 Pro integrated GPU |
| VRAM    | 6 GB                                             | 12 GB                              |
| RAM     | 16GB                                             | 32 GB                              |
| Storage | 8GB HDD                                          | 20GB SDD                           |

{% hint style="info" %}
Mobile hardware targets below are accurate as of April 2026 and may shift as the app evolves.
{% endhint %}

**Android**

|        | Minimum Required                 | Recommended Settings         |
| ------ | -------------------------------- | ---------------------------- |
| OS     | Android 12                       | Android 13 or newer          |
| Device | Samsung Galaxy A53 or equivalent | Samsung Galaxy A54 or better |
| RAM    | 4 GB                             | 6 GB or more                 |

**iOS**

|        | Minimum Required         | Recommended Settings |
| ------ | ------------------------ | -------------------- |
| OS     | iOS 18                   | iOS 18 or newer      |
| Device | iPhone 13 / SE (3rd Gen) | iPhone 14 or newer   |

Get the mobile app from the [App Store (iOS)](https://apps.apple.com/app/decentraland/id6478403840?utm_source=docs\&utm_medium=internal\&utm_content=ios) or [Google Play (Android)](https://play.google.com/store/apps/details?id=org.decentraland.godotexplorer\&pcampaignid=web_share\&utm_source=docs\&utm_medium=internal\&utm_content=android). See [Decentraland on Mobile](/mobile-app/mobile-app) for more details.

</details>

<details>

<summary>How do I explore and navigate Decentraland?</summary>

Decentraland consists of the open, traversable **Genesis City** made up of community parcels that are referenced by coordinates (e.g. Genesis Plaza, Decentraland's central default spawn point is 0,0), as well as individual **Worlds**, more intimate 3D spaces in the Decentraland ecosystem that can be teleported into.

To explore **Genesis City**, you can run around using your arrow or WASD keys, jump to locations by clicking on them from the map, or teleport by typing the following command into the chat box and hitting 'Enter':

• `/goto x,y` (x,y are the coordinates of a scene)

To teleport to a specific **World**, you'll also use a chat command:

• `/goto World'sName`

![](/files/ViTtD8GDqcu3ExeRp7sz)

</details>

<details>

<summary>How do I get Wearables, Emotes, LAND, and NAMEs in the Marketplace?</summary>

Ready to start your Decentraland shopping spree in the [Marketplace](https://decentraland.org/marketplace/)? Browse through hundreds of community-made Wearables and Emotes to customize your digital identity, buy or rent Genesis City LAND parcels, or claim your unique NAME (which comes with it's own World!).

Once you've found an item you'd like to buy, you can easily pay by card or with a wide variety of cryptocurrencies. If you're buying a Wearable or Emote, the item will appear in your Backpack in a matter of minutes and you can feel happy in the knowledge that you're supporting Decentraland creators, who keep 97.5% of sales!

Anything you purchase in the Marketplace is truly owned by you, with your ownership registered on the blockchain. You can resell items whenever you wish, which will also support the original creator with 2.5% royalties.

</details>

<details>

<summary>How can I meet people in Decentraland?</summary>

The best way to meet new people in Decentraland is to attend [events](https://decentraland.org/events?utm_org=dcl\&utm_source=generaldocs\&utm_medium=organic\&utm_content=faq) and start chatting! Browse the event page for current and upcoming events and don't be shy once you jump in, Decentraland's community is known for being welcoming. 💜

Keep an eye out for weekly tours and meetups, such as ABC DCL - Adventures of Decentraland, which are specifically targeted at new community members!

</details>

<details>

<summary>How can I learn about in-world events?</summary>

Decentraland's [Event Page](https://decentraland.org/events?utm_org=dcl\&utm_source=generaldocs\&utm_medium=organic\&utm_content=faq) is the official place where anyone in the community can post their in-world events to invite everyone to come. To stay on top of events, check the event page regularly and you can also follow Decentraland on social channels, such as [X](https://x.com/decentraland), or [subscribe](https://decentraland.beehiiv.com/) to the weekly newsletter to learn about upcoming activities!

</details>

<details>

<summary>How do I take pictures in-world?</summary>

If you'd like to get snapshots of your favorite moments in Decentraland, just press C on your keyboard to open the Camera. A helpful guide with camera controls can be found on the bottom right of your screen.

![](/files/GUinZZOlgp9VOD9wbfoy)

Your Gallery has space for up to 500 photos, from there you can easily share your images with a link or download them onto your computer.

{% hint style="info" %}
**Pro tip:** Feature your favorite photos on your Decentraland Profile by toggling the 'Set as Public' option from the three dots menu in the upper right of your selected photo.
{% endhint %}

</details>

<details>

<summary>How can I get involved in Decentraland governance?</summary>

Decentraland's DAO is the heart of the community-driven world's governance. To get started, you can read through the [DAO forums](https://decentraland.org/governance) to learn about current issues, see what the community consensus is, and add your own comments. Learn more on the [DAO's official page](https://decentraland.org/dao/).

</details>

## The Basics

<details>

<summary>What are Wearables?</summary>

Wearables are the digital assets you can mix and match to customize your avatar's appearance. They range from articles of clothing, accessories, body parts, and whole skins.

![](/files/hNaY6jmWuXgbuhUKvriA)

A variety of free base Wearables are always available in your Backpack (click on the backpack icon on the left when you're in-world to try them on!), and you can browse through thousands of community-made items in the [Marketplace](https://decentraland.org/marketplace/browse?section=wearables\&vendor=decentraland\&page=1\&sortBy=newest\&status=on_sale) to craft your unique look. Can't find what you're looking for? Consider making your own.

</details>

<details>

<summary>What are Emotes?</summary>

Emotes are animations that allow your avatar to express reactions, perform dance moves, or engage in activities such as yoga or painting. Just like Wearables, there are a set of free, base Emotes available to everyone, but you can also browse the [Marketplace](https://decentraland.org/marketplace/browse?assetType=item\&section=emotes\&vendor=decentraland\&page=1\&sortBy=recently_listed\&status=on_sale) to find an even larger variety. Or make your own!

![](/files/iohRVphiToDZ6Tyc25vr)

To use Emotes in Decentraland, you'll want to become familiar with the Emote Wheel pictured below. This shows a set of the 10 Emotes you are most likely to use (you can customize these Emote slots from your Backpack).

To trigger an Emote, you have 3 options:

* **Beginner:** Click on the icon of a dancing person in the bottom left of your screen to open the Emote Wheel and click on the Emote you want to use
* **Intermediate:** Press **B** on your keyboard to open the Emote Wheel and click on the Emote you want to use
* **Pro:** Use the shortcut **B** + the number of the Emote you want to use (e.g. **B1**) on your keyboard to trigger an Emote without opening the Emote Wheel

![](/files/grQjGHbpellNxjBIemX1)

</details>

<details>

<summary>What is a NAME?</summary>

A Decentraland NAME is like an official username for your avatar, owned by you on the blockchain. When you see other avatars with a name that doesn't have something like '#1234' at the end, it's because they have equipped a NAME to their avatar.

Having a Decentraland NAME comes with a few extra perks: in addition to making your avatar uniquely recognizable, each NAME comes with a World—your personal virtual space to experiment with builds or host your own get-togethers. Each NAME you own also gives you 100 VP (Voting Power) to use in [DAO governance](https://dao.decentraland.org/). Decentraland NAMEs are also part of the ENS network, so you could use your NAME across Web3.

[Claim your unique NAME](https://decentraland.org/marketplace/names/claim) now or check out a [helpful tutorial](https://www.youtube.com/watch?v=OKqXmO5fD0s\&ab_channel=Decentraland) first.

Once you've claimed your NAME, assign it to your avatar at [decentraland.org/builder/names](https://decentraland.org/builder/names).

</details>

<details>

<summary>What is MANA?</summary>

[**MANA**](https://etherscan.io/token/decentraland) is Decentraland's fungible, ERC20 cryptocurrency token. MANA can be used to purchase LAND parcels, NAMEs, and other digital assets or can be traded for various goods and services within the Decentraland ecosystem. For a current summary of critical stats like total and circulating supply, please visit the [**MANA Token Information**](https://governance.decentraland.org/transparency/) transparency dashboard.

</details>

<details>

<summary>What is LAND?</summary>

LAND is a non-fungible digital asset maintained in an Ethereum smart contract. LAND parcels, make up the map of Decentraland's Genesis City and are referenced using unique x,y coordinates. Each LAND token includes a record of its coordinates, its owner, and a reference to a content description file or parcel manifest that describes and encodes the content the owner wishes to serve on their LAND.

One parcel of LAND is 16m x 16m, or 52ft x 52ft. Height is restricted based on scene limitations.

</details>

<details>

<summary>What is an Estate?</summary>

Like LAND, an Estate is a non-fungible digital asset. An Estate is an association of two or more directly adjacent parcels of LAND. These parcels must be directly adjacent and cannot be separated by a road, plaza or any other parcel. By connecting parcels to form Estates, you can more easily manage your larger LAND holdings. Estates are especially useful when building larger scenes that span more than one parcel.

</details>

<details>

<summary>What are Worlds?</summary>

Worlds are your personal 3D space in the metaverse. The exist separately from the open-world map of Decentraland's Genesis City and are perfect for those looking to experiment with 3D creation or host their own virtual space.

Getting your own World is easy: when you [**claim a Decentraland NAME**](https://decentraland.org/marketplace/names/claim) you not only get a unique username that can be used across Web3, but also 100 Voting Power (used in Decentraland governance), and of course your own World to use as you wish. Learn more [**here**](https://decentraland.org/blog/about-decentraland/decentraland-worlds-your-own-virtual-space).

</details>

<details>

<summary>What is a wallet address?</summary>

In Decentraland users truly own their digital assets, such as Wearables or NAMEs, with ownership registered on the blockchain. To enable this, every Decentraland account is linked to a unique digital wallet. If you created your Decentraland account by signing into a social profile such as Google or Discord, a digital wallet was made for your account behind the scenes.

A wallet address is a unique string of characters associated with a digital wallet, similar to a bank account number. With it, others can send you items, such as Wearables. You can find the wallet address associated with your account under your name when you view your profile online or in-world.

</details>


# Creating in Decentraland

How to create content for Decentraland

<details>

<summary>What can I create in Decentraland?</summary>

It would be easier to ask what you *can't* create in Decentraland! As a virtual world created by its users, in Decentraland you can create just about everything you see.

Decentraland Creators make all the components that go into crafting a digital identity, such as Wearables (this can include whole skins, body parts, articles of clothing, hair styles, accessories, etc.) as well as Emotes, animations for your avatar which can include props and sounds in addition to movement.

The landscape and activities of Decentraland are also all shaped by creators. Walking through Decentraland's Genesis City, you can explore a variety of content from different creators, built side-by-side: art galleries, theaters, gardens, night clubs, racetracks, casinos, entire game experiences, and more can be explored and created by everyone! To start building, [download](https://decentraland.org/download/creator-hub) Decentraland's Creator Hub.

Learn more about creating in Decentraland at [decentraland.org/create](http://decentraland.org/create).

</details>

<details>

<summary>How do I become a Decentraland creator?</summary>

Anyone can be a Decentraland creator, all it takes is a little knowhow and endless creative ideas! Depending on what you want to create, the knowledge you need to know differs. If you just want to create cool virtual scenes for yourself or to host events, then you can get started creating scenes right away by [**downloading**](https://decentraland.org/download/creator-hub) Decentraland's Creator Hub.

For those familiar with or willing to learn 3D modeling and/or programming, all the technical specs and procedures you need to know to create in Decentraland can be found on the Creator Docs page, and there are many tutorials available online for creating [**Wearables**](https://www.youtube.com/watch?v=zl43Fw7zROQ\&list=PLEl6fe1igtKBFDcxaC64Uxamo7kQUi5mf\&pp=iAQB), [**Emotes**](https://www.youtube.com/watch?v=-iWslh4uQIk\&list=PLAcRraQmr_GN8LcnnQk2BByo9L2Orvp9c\&pp=iAQB), and [**experiences**](https://www.youtube.com/watch?v=fblj_FxUvM4\&list=PLAcRraQmr_GP_K8WN7csnKnImK4R2TgMA\&pp=iAQB).

**Wearables & Emotes**

If you're interested in designing interactive experiences, [**download**](https://decentraland.org/download/creator-hub) Decentraland's Creator Hub and start creating immersive scenes and games which you can then publish to [**Worlds**](https://decentraland.org/blog/about-decentraland/decentraland-worlds-your-own-virtual-space) or LAND in Decentraland's open-world Genesis City. You retain all control over your content, can edit or remove it whenever you wish, and keep all proceeds of any funds you may generate through your experiences.

</details>

<details>

<summary>What tools are necessary to be a Decentraland creator?</summary>

To build scenes or interactive experiences for Genesis City or Worlds, Decentraland's Creator Hub is your one-stop-shop. Download it [here](https://decentraland.org/download/creator-hub) to get started and check out [these tutorials](https://www.youtube.com/watch?v=wm8ZD2kSyKA\&list=PLAcRraQmr_GPrMmQekqbMWhyBxo3lXs8p\&pp=iAQB) to learn the ropes.

If you'd like to design Wearables or Emotes, the most common program Decentraland creators use is the free, Blender. Get started with these handy tutorials for [Wearables](https://www.youtube.com/watch?v=zl43Fw7zROQ\&list=PLEl6fe1igtKBFDcxaC64Uxamo7kQUi5mf) and [Emotes](https://www.youtube.com/watch?v=-iWslh4uQIk\&list=PLAcRraQmr_GN8LcnnQk2BByo9L2Orvp9c\&pp=iAQB).

Learn more about creating in Decentraland with the Creator Docs.

</details>

<details>

<summary>Is it possible to monetize my creations?</summary>

Yes, of course! Decentraland creators are able to monetize their skills in many ways:

* Wearable and Emote creators earn 97.5% of the profits on all primary sales and 2.5% royalties on any secondary sales after publishing their creations in the Marketplace paying a $100 USD publication fee
* Scene creators are free to monetize their in-world experiences and retain 100% of the revenue they generate
* Creators can offer their services for hire on [**Decentraland Studios**](https://studios.decentraland.org/).

</details>

<details>

<summary>Does Decentraland take a cut from creator earnings?</summary>

As a decentralized platform with no centralized entity looking to make a profit, Decentraland's revenue-share model puts creators first. Decentraland creators keep **97.5%** of the earnings from sales of their items—the highest revenue-share of any platform in the industry to date—and additionally earn **2.5%** royalties on secondary sales.

The 2.5% withheld from creator earnings is the transaction fee that is associated with any sale in the Marketplace. This fee is collected in Decentraland's DAO treasury to be reinvested into the platform through community initiatives or to cover operational costs.

</details>

<details>

<summary>Do I need to own LAND to build in Decentraland?</summary>

Not necessarily. Anyone is free to create content (scenes and interactive experiences) with Decentraland's [**Creator Hub**](https://decentraland.org/download/creator-hub/)—once it's time to publish your creations in-world, there are multiple options available besides owning LAND.

* **Worlds:** Worlds are your personal 3D space in the metaverse. The exist separately from the open-world map of Decentraland's Genesis City and are perfect for those looking to experiment with 3D creation or host their own virtual space. You can get your own when you [get a Decentraland NAME](https://decentraland.org/marketplace/names/claim). Learn more about NAMEs [**here**](https://decentraland.org/blog/about-decentraland/decentraland-worlds-your-own-virtual-space).
* **Rent LAND:** If you want to publish in Decentraland's open-world Genesis City but don't want to commit to a LAND purchase, you don't have to! It's easy to rent LAND for the short or long term in the Marketplace where you can pay by card, bank transfer, or cryptocurrency. [**Browse rentals**](https://decentraland.org/marketplace/lands?assetType=nft\&section=land\&vendor=decentraland\&page=1\&sortBy=newest\&onlyOnRent=true) to see what's available.
* **Open Calls for Creators:** The Foundation often announces [**Open Calls**](https://twitter.com/decentraland/status/1704918402907726030) to collaborate with creators to build experiences and scenes for various Decentraland events such as the annual music, art, and fashion festivals. Stay tuned to Decentraland [**socials**](https://twitter.com/decentraland) or [**subscribe**](https://decentraland.beehiiv.com/subscribe) to the weekly newsletter to stay updated!
* **Community Magic:** If you're passionate about sharing your creations with the community, in Decentraland there will always be a way to make it happen. The creator community is very welcoming and helpful. If you're just getting started, join the [**Community Building Discord**](https://discord.gg/cbdcl) to start making connections.

</details>

<details>

<summary>Where can I hire creators to design or build something for me?</summary>

[Decentraland Studios](https://studios.decentraland.org/) is a vetted registry of Decentraland's most talented creators skilled in everything from Wearable design and 3D building to event management. Check it out to find a team to work with!

</details>

<details>

<summary>Can I control who can see the content of my World or LAND?</summary>

Yes. World permissions can be accessed at [decentraland.org/builder/worlds](https://decentraland.org/builder/worlds). Here you can restrict public access and create a customized list of up to 100 accounts that are allowed to visit your World. From here you can also grant editing and streaming permissions for your World.

For restricting access to your LAND: You can control how certain content on your parcel is served to other users within the Decentraland network. For example, you could make 3D models, images, video, or sound content only visible to a player in Decentraland after they have submitted a payment or fulfilled some other requirement. However, remember that by uploading content to Decentraland's content servers, you are essentially making it publicly available since the content servers are a distributed file system.

You can control who you can see and interact with (and who can see and interact with you) within Decentraland. For example, imagine that you have a house on your parcel and you only want to invite certain friends into your house. You will be able to specify which players you can see (and which players can see you) within your house, but you won't necessarily be able to prevent anyone from seeing your house or its contents since the assets required to render your house reside on the content server.

</details>


# Posting Events

How to post events in Decentraland

<details>

<summary>Can anyone post an event on the Event Page?</summary>

Yes, anyone in the Decentraland community can create an Event listing for an event that takes place within Genesis City or a World. Being a LAND owner is not a requirement.

</details>

<details>

<summary>How do I post an event to the Event page?</summary>

Check out a quick breakdown here: <https://www.youtube.com/watch?v=jMNk\\_W1yqjU>

And yes you can edit event details after publishing!

</details>

<details>

<summary>How does the event review process work?</summary>

Review times depend on day/time of event submission, but won't take longer than a few hours. Events are reviewed by the team at the Decentraland Foundation. Add your email or Discord username so you can be contacted if necessary.

</details>

<details>

<summary>My event wasn't published, why not?</summary>

Your event may not have passed review because you did not fill in all the required information. Make sure you complete every field in the form when submitting an event.

</details>


# My Account

Account settings

<details>

<summary>How do I assign a NAME to my avatar?</summary>

Congratulations! You've claimed your unique NAME. All NAME management takes place at [decentraland.org/builder/names](https://decentraland.org/builder/names). There, you'll see the NAME you've just acquired and can assign it to your avatar.

</details>

<details>

<summary>Where can I find my wallet address?</summary>

You can easily copy the wallet address associated with your Decentraland account in-world or from decentraland.org.

In-world, click on your profile picture in the top left, and your wallet address will be under your avatar's name. Online, make sure you're logged in, then open your profile. You wallet address will be under your avatar's name.

</details>

<details>

<summary>How can I get customized email notifications?</summary>

Want to stay up to date with what's happening in-world while your're offline? Sign up to get personal notifications to your email from [Account Settings](https://decentraland.org/account/).

From the Decentraland website, click on your profile picture in the upper right to open the personal menu, select 'Account Settings', and then 'Email Notifications' on the left.

After adding your email, you'll be able to select the types of notifications you'd like to get emails about, e.g. Marketplace sales, Event reminders, or DAO activity.

</details>

<details>

<summary>I've lost access to the digital wallet linked to my Decentraland account, now what?</summary>

Unfortunately, if you lose access to your wallet, the Decentraland account linked to it cannot be recovered. You will need to make a new Decentraland account. Please remember to always keep your wallet recovery pass phrases in a safe and secure location.

</details>


# Security

Security recommendations

<details>

<summary>Is it ok to share my wallet address?</summary>

Yes, your wallet address, a unique sting of numbers and letters, is like a bank account number. Others can use it to send you gifts, like a Wearable, but not to take items from you.

You can find your Decentraland account wallet address by clicking on your profile in-world or when you're logged in on decentraland.org. It will be under your avatar's name.

</details>

<details>

<summary>Someone wants to send me an item for free—is it a scam?</summary>

Sending gifts of Wearables or Emotes is a common tradition in Decentraland, so this should not automatically register as a red flag. For someone to send you a gift, they will need your wallet address, a unique string of numbers and letters, but data this alone is not something that can be used to scam you. If someone sends you a gift using your wallet address, it should appear in your Backpack without any necessary action from you.

What you should **never** give out is your 'seed phrase' (this applies if your Decentraland account is linked to an external digital wallet).

</details>

<details>

<summary>What are the most common scams to look out for?</summary>

One of the most common scams are websites, social accounts, emails, and DMs impersonating Decentraland and advertising a free airdrop of MANA. This is something Decentraland will **NEVER** do.

Another common tactic is pretending to be a potential client and sending a file containing a virus. Always be very cautious with messages from people you don't know personally and **never** download files from them.

![](/files/OyKf8ZrhsqbZOHzilqZ5)

A good rule is to always take the time to verify urls and email addresses before taking any actions. True Decentraland websites will always have the base [decentraland.org](http://decentraland.org) and the weekly newsletter will only come from <hello@decentraland.org>.

Read more about [Safety Tips & Tricks](https://decentraland.org/blog/about-decentraland/how-to-keep-your-digital-assets-safe-in-the-metaverse).

</details>

<details>

<summary>What should I do if my account/digital wallet has been compromised?</summary>

If you've unfortunately been the victim of account compromise and notice your wallet has been drained, there are a few things you should do next, depending on how the hack occurred:

* If you have any remaining assets in your wallet, you can try to transfer them to a new, uncompromised account immediately and discontinue using the compromised wallet completely. Create your new wallet from a different device in case the virus is still present on your computer.
* If the hack occurred through a downloaded file, you'll want to wipe your PC completely to remove any malware.
* Regardless of how the hack occurred, you can report the incident to your local authorities. This can not only help with the investigation—given local legislation—but also assist in creating a police report, which can be useful for flagging compromised assets on platforms like Opensea.

After securing your assets and ensuring your devices are clean, you can create a new Decentraland account and get back to exploring.

</details>


# Places

Places

<details>

<summary>What are Places?</summary>

[Places](https://decentraland.org/places/) shows certain points of interest in Genesis City and Worlds.

</details>

<details>

<summary>How do I edit the title, description or image of my Place?</summary>

The title, description and image of your Place are taken from the scene metadata. Learn more about editing scene metadata in the Creator documentation.

</details>

<details>

<summary>How does my Place get updated?</summary>

When you re-upload your scene, the Places website will update any metadata automatically.

</details>

<details>

<summary>What happens if I change my Place significantly?</summary>

Each Place is assigned a unique ID. When certain conditions are met, your Place may be deemed "new", resulting in a new ID assignment. This change will cause your Place to lose any accumulated favorites and likes. For details on these conditions, please refer to [**ADR: Place Identifiers**](https://adr.decentraland.org/adr/ADR-186).

</details>

<details>

<summary>How is the like percentage calculated?</summary>

In order to prevent abuse, the like percentage is calculated from likes and dislikes from users who have at least 100 voting power. Anyone with an account can like or dislike, but only qualifying votes are used to calculate the like percentage.

Increase your chances of getting a good rating by making sure your Place has a title, description and thumbnail.

</details>

<details>

<summary>How can my Place become a Point of Interest?</summary>

Points of interest are notable locations in Decentraland. These "POIs" are promoted in several areas of the virtual world's UI, and are promoted as good places for users to explore, especially people new to Decentraland.

You can create a proposal in the [**DAO**](https://decentraland.org/dao/en/) to nominate your Place as a Point of Interest.

</details>

<details>

<summary>Which Worlds appear in the Worlds tab?</summary>

As defined in the *Worlds 1.0 - Short-Term Plan* [**DAO proposal**](https://decentraland.org/governance/proposal/?id=e712bb50-e822-11ed-b8f1-75dbe089d333/), we allow discoverability of Worlds deployed to Foundation's World Content Server only for NAME owners that also hold LAND or an active LAND rental contract.

</details>


# Contact & Support

How to get in touch with Decentraland and Support

<details>

<summary>I need help, how do I contact the Support Team?</summary>

In the bottom right of any [decentraland.org](http://decentraland.org) page, you'll see a chat icon. Click on this to open a chat with the Support Team or go to [decentraland.org/help](http://decentraland.org/help).

</details>

<details>

<summary>Where can I contact the Decentraland Foundation to discuss a partnership?</summary>

You can email the Foundation's partnership team at <partnerships@decentraland.org>.

</details>

<details>

<summary>How can I stay up to date with Decentraland news?</summary>

Follow Decentraland on [Instagram](https://www.instagram.com/decentraland_foundation/), [Discord](https://dcl.gg/discord), or [X](https://twitter.com/decentraland), and [subscribe](https://decentraland.beehiiv.com/subscribe) to the weekly newsletter to make sure you never miss and update!

</details>


# Overview

Exploring Decentraland Overview

**'In-World'** refers to anything happening inside Decentraland's virtual world—this is where the magic happens!

![](/files/sLgmfiVwy4ZssAUbd85l)

Decentraland's main landmass, Genesis City.

## **How to Jump Into Decentraland**

To enter the virtual world, download Decentraland on your device of choice:

* [Desktop app](https://decentraland.org/download/) — for Windows and macOS.
* [Mobile app](/mobile-app/mobile-app) — for iOS and Android.

Once you've installed it and logged into your Decentraland account, you can start exploring Decentraland's Genesis City (pictured above), and it's archipelago of off-map Worlds. The same account, avatar, and inventory work across every client.

## Genesis City vs. Worlds: Decentraland's Landscape Explained

**Genesis City** is the main landmass of Decentraland, visible on the virtual world's map. It's made up of thousands of community-owned LAND parcels, each 16m x 16m in size, and traded in [Decentraland's Marketplace](https://decentraland.org/marketplace/lands). As the city is laid out in a massive, four-quadrant grid, each parcel is referenced by a set of coordinates—at the very center (0,0), lies Decentraland's default spawn point: Genesis Plaza.

Despite being a patchwork of individually-owned parcels, Genesis City is unique in its openness and traversability. If you're looking for an adventure, just take a walk across the map—there's always something new to discover from Decentraland's global community!

In contrast to Genesis City LAND parcels, **Worlds** are more intimate virtual spaces, like personal islands located off the Decentraland map. While you can't walk to them, you can teleport to a World if you know its name or have an invite link. Unlock your own World by [getting a Decentraland NAME](https://decentraland.org/marketplace/names/claim). It's your space to use as you wish—set it as private or public, host events, or practice your building skills. Learn more about NAMEs [here](/faqs/decentraland-101#what-is-a-name).

Learn more about how to explore and navigate Decentraland [**here**](/in-world/exploring).


# Finding Events

Finding Events in Decentraland

The best way to meet new people in Decentraland is to attend events! Anyone in the community can submit an event to Decentraland's Event page, so you can discover a wide variety of events, from annual music festivals to weekly hang outs, if you stay updated.

**How to check current and upcoming events in Decentraland:**

* **Event Page:** Browse Decentraland's Event page at [decentraland.org/events](http://decentraland.org/events). You can jump directly to live events or RSVP to upcoming events to get an in-world notification when they start.
* **Genesis Plaza:** Check the Event board when you land in Genesis Plaza. It will display events happening soon.
* **World Map:** To see where live events are happening, open the map in-world and look for a red and white icon. Clicking on it will bring up event info and a jump in button.
* Follow Decentraland [**socials**](https://twitter.com/decentraland) or [**subscribe**](https://decentraland.beehiiv.com/subscribe) to the weekly newsletter to stay updated

Want to submit your own event? Learn more [**here**](/faqs/posting-events).


# Friends & Chatting

Friends & Chatting in Decentraland

Decentraland is all about bringing people from around the world together. Making friends and chatting is key to feeling a part of the virtual world's community. Here you'll learn how to manage your friendships and chats.

## Friendship Management

The Friends icon lives in the bottom left of your screen and is home to your Friends List, Friend Requests, and Blocked accounts.

### **Friend's List**

Hovering by a Friend's name will make other options appear. If your friend is online, you can chat or jump to their location. If you click on the three dots by their name, you can access their personal menu.

![](/files/ZrvKxBSnMt3KcyHn8OER)

### **Friend Requests**

To send a friend request to someone, open their profile (hovering over any avatar with your mouse will show the option to 'View Profile'). In the top right corner of the profile card, you'll see a ruby 'Add Friend' button. After selecting that, you'll have the option to add a message to your friend request before sending it out.

See requests you've sent and received in the 'Requests' tab of your Friends interface. Requests with an envelop icon have a message attached. Read it by clicking on the envelope.

![](/files/0zBYuDKtmPYnmTuvXBAs)

To cancel a request or unfriend someone, you'll use the same button in their profile, as it changes in relation to your status with someone. Hovering over the button will show the option to cancel requests or unfriend.

![](/files/ml1tQbBOUjsOufjPNChF)

## Blocking Accounts

If you block a player in Decentraland, you will no longer see their avatar in-world, and they will not be able to send you friend requests or messages. You will also not see each other's messages in public or private chats.

**How to Block a Player**

To block a player, open their profile card by clicking on their avatar and click on the three dots in the upper right corner above their avatar image, then select the option 'Block'. You can also block someone within a chat by clicking on their name to open their personal menu and selecting 'Block'.

![](/files/lneej9QV7zPNHhgj0Xf9)

**How to Unblock a Player**

Blocked accounts appear in a sperate tab of your 'Friends' interface. Hovering over someone's name in this section will reveal the 'Unblock' button.

## Chats

In Decentraland, the main line of communication is text-based chatting. In-world, you can always see a chat bar in the lower left of your screen. This is where you can send DMs to friends (or anyone depending on selected settings) and chat with the people around you via the Nearby Chat.

### Nearby Chat

Identifiable by the Decentraland icon, Nearby Chat is where you can chat with the people around you in-world, even if you aren't friends. It will always be listed at the top of your chat list. Nearby Chat can also be used for entering Chat commands that only you will see—learn more [**here**](/in-world/shortcuts-and-chat-commands#chat-commands).

![](/files/uDMWCawrrwiqzpQCjGxo)

### Private Chats

The option to start chatting with someone can be accessed from their Profile or personal menu. If you are friends with them, a chat icon will also appear next to their name in your Friends List. However, keep in mind, outside of friendships, who you can send and receive DMs from will depend on both parties' chat settings.

![](/files/dMoVfRLrsAltSLnj41I0)

Please also note that messages can only be sent to players that are currently online.

![](/files/QRGpGBJEjEhNvZXQnX9M)

### Chat Settings

Within your in-world Settings, you'll see a Chat tab.

![](/files/2lmb5EssZ9wf52LXfSzz)

**DM Permissions**

There are two options when it comes to selecting who you want to be able to send and receive DMs from:

* **Friends Only:** You'll only be able to send and receive private messages from Friends
* **Everyone:** Players who select this option will be able to send private messages to each other, even if they are not friends.

**Notification Pings**

If you have your sound on, you have the option of receiving a notification ping for selected chats. You can set your preferences from each individual chat by clicking on the 3 dots in the upper right of a chat box. From the main Chat Settings, you can select the setting for all your chats simultaneously.

![](/files/lywicqsm5F2LbkodX825)

**Chat Bubbles**

You may notice chat bubbles appearing over avatars when you're in-world. Currently, you can choose to see chat bubbles for no chats, all chats, or only the Nearby Chat. Chat bubbles from private chats can only be seen by the chat's participants.


# Customizing Your Avatar

Customizing Your Avatar in Decentraland

In Decentraland—with community-made Wearables and Emotes—you can shape your avatar to be *anyone,* whether it's the truest version of yourself or your hidden alter ego.

## Avatar Appearance

Edit your avatar's appearance in the Backpack. Look for a backpack icon in the sidebar menu. Here you can change your avatar's body features and attire.

![](/files/3wzA2ORBSrbakOyrYsI4)

### Getting More Wearables

In addition to the free, starter items that are always available in your Backpack, you can choose from thousands of community-made Wearables in Decentraland's Marketplace at [decentraland.org/marketplace](http://decentraland.org/marketplace). Featuring everything from clothing, hair styles, full skins, and more, you're sure to find what you need to create your unique look. Purchased items will appear in your Backpack in-world.

## Avatar Username

In Decentraland you can have two types of usernames:

* A general, non-unique one that will always have a random string of numbers after it (e.g.#1234)
* A NAME username, one that is unique to you, comes with a bunch of extra perks, and has a verified checkmark icon following it instead of a string of numbers. Learn more about NAMEs [**here**](/faqs/decentraland-101#what-is-a-name).

You can always edit your username from your Profile whether it's editing a general username or applying a NAME you own. [**Claim your unique NAME**](https://decentraland.org/marketplace/names/claim) now or check out a [**helpful tutorial**](https://www.youtube.com/watch?v=OKqXmO5fD0s\&ab_channel=Decentraland) first.

![](/files/9E64zuMqZ3Z8ts2xf7Sx)

## Emoting with Your Avatar

Emotes are animations that allow your avatar to express reactions, perform dance moves, or engage in activities such as yoga or painting. You can trigger them from the Emote Wheel when you press '**B**' or click on the dancing figure icon in the sidebar menu.

![](/files/mZc76TnER6rTuKcjUX7r)

## Customizing Your Emote Wheel

The Emote Wheel has 10 slots for different Emotes. You can customize which Emotes appear there from your Backpack.

![](/files/kvTwQK50ejefApKs3r4t)

### Getting More Emotes

Like the starter Wearables in your Backpack, your avatar will always have the free, basic Emotes available to everyone, but there's even more community-made Emotes waiting to be discovered in Decentraland's Marketplace at [decentraland.org/marketplace](http://decentraland.org/marketplace). Any Emotes you purchase will appear in your Backpack in-world.


# Your Profile

Your Profile in Decentraland

In-world, your profile helps others get to know who you are. When you hover over someone's avatar, the option to 'View Profile' will appear. To view and edit your own profile, click on your profile picture, located at the top of the sidebar menu, on the left of your screen.

You'll see a pencil icon next to the Profile components you can edit, such as your username and 'About Me' section. Writing a little bit about yourself and your interests can make it easier to make friends, but be mindful not to share sensitive personal information.

![](/files/FJsPK00jGUsyiQE9l7wW)

## Badges

Badges are a fun way to celebrate your achievements and activities in Decentraland. They can also say a lot about you!

Check the Badges tab of your profile to see your Badges progress and what you need to do to unlock a new Badge or the next tier of a Badge you've already earned.

![](/files/XERZtbSOjHmAxBz1GO8O) ![](/files/aJAJcYNsN3N1Hv60Ot5S)

## Photos

Help others get to know you by sharing your favorite pictures of your time in Decentraland.

**How to add a photo to your Profile:**

1. Open your Photo Gallery by clicking on the Picture icon in the sidebar menu. Any pictures you've taken with the Camera in-world will appear here.
2. Click on the 3 dots in the top right corner of the photo you want to share on your profile
3. Toggle 'Set as Public' to the on position

You're set! Any photo marked as Public will appear in your Profile. To remove a photo, just toggle off the Public setting.

![](/files/QoqGVD3E72FNxnVdcWZ7)


# Earning Rewards

Earning Rewards in Decentraland

Exploring Decentraland, you never know what you'll find—sometimes treasure in the form of Wearable and Emote giveaways! But those can depend on the particular scene or if a special event is happening.

If you're on the hunt for *guaranteed goodies*, look no farther than Decentraland's Weekly Marketplace Credit Rewards and the multi-day Gaming Quest.

## Weekly Marketplace Credits Rewards

Marketplace Credits can be used in Decentraland's Marketplace to buy Wearables and Emotes for free! 1 Credit = 1 MANA in value. As long as a Credit season is currently active, anyone can earn Credits in exchange for completing weekly goals, such as jumping into Decentraland regularly and attending events.

Click on the Marketplace Credit icon in the sidebar menu to open your Weekly Rewards interface. There you can track your progress towards your weekly goals and your Credit balance. Learn more about Marketplace Credits [here](https://decentraland.org/blog/announcements/marketplace-credits-earn-weekly-rewards-to-power-up-your-look).

![](/files/28z32wTUYoXneBRsy6uD)

## Gaming Quest

If you're looking for a challenge that comes with great rewards, the Gaming Quest is for you! You can access it at anytime by clicking on the treasure chest icon to the right of the Mini Map.

![](/files/zYutOWivVVMnzIevYY16)

Currently, the Quest comprises 25 days of gaming challenges, each with its own Wearable or Emote prize. If you open the map, you'll see purple treasure chest icons marking the locations of the current day's Gaming Quest challenges—you can also teleport directly to the challenge locations by clicking on the red arrows next to each task. Once you complete all the challenges for the current day, that day's prize will be sent to your Backpack!

![](/files/zRnyjK2SqAJ02AqdxH0j)


# Exploring

Exploring Decentraland

Decentraland is completely made up of community-generated content. When you're out exploring, you never know what you might discover—whether it's on the Genesis City map or in someone's World! The options can feel overwhelming, so here are a few tips for getting the most out of your adventure.

Learn more about the difference between Genesis City and Worlds [**here**](/in-world/overview#genesis-city-vs-worlds-decentralands-landscape-explained).

## Exploring Genesis City

With thousands of community-owned parcels to cross in Genesis City, just walking straight across is its own adventure. However, if you'd like to be more precise in your exploration, you'll find the Map to be very helpful.

### **Use the Map to Discover**

The Map can be opened by clicking on the Mini Map in the top left corner of your screen or by clicking on the Map icon in the sidebar menu.

### **Layers & Pins**

Looking at the satellite image of Genesis City, you'll notice a lot of different icons. **To change the map type and toggle location pins**, click on the layers icon in the lower left of the map.

The red '**Live Events**' pins show the location of an event that is currently happening. Click on the icon to see more about the event and click 'Jump In' to teleport to its location.

The yellow '**Points of Interest**' pins mark locations the community deemed to be must-see—they could be anything from a game to an impressive work of art. Clicking on the icon will bring up a description and a 'Jump In' button to teleport you directly.

![](/files/Cs8tSDrJVpwAeBqbDVEd)

### **Location Categories**

Discoverer interesting locations in Decentraland based on categories. When you open the map, you'll see a variety of Category bubbles along the top of the screen, including topics like Art, Music, Games, etc.

Click on a category to bring up pins marking the locations tagged with that category. Clicking on one will open an information card with a description as well as a 'Jump In' button so you can teleport directly to the scene.

![](/files/HatmacUvonN1YKTcP5a3)

### **Teleport to Specific Parcels**

In-world, you can jump directly to a specific parcel using the **Map** or **Chat Commands**.

* **Teleportation via Map:** Clicking any location on the Map will bring up an info card on the location, even if it's an empty parcel. This card will also have a 'Jump In' button that will teleport you to the spot.
* **Teleportation via Chat Command:** If you know the coordinates of the parcel you want to jump to, put the following command into the Nearby chat box (in the bottom left of your screen) and hit \[**Enter**].
  * `/goto x,y` (e.g. `/goto 0,0` for Genesis Plaza)
    * Learn more about Chat Commands [**here**](/in-world/shortcuts-and-chat-commands#chat-commands).

## Exploring Worlds

In contrast to Genesis City, **Worlds** are more intimate virtual spaces, like personal islands located off the Decentraland map. They can only be visited via teleportation.

### Discover New Worlds

While Worlds tend to be more private, you can discover them by browsing Worlds listed on the [**Places page**](https://decentraland.org/places/worlds/) and by attending events hosted at Worlds.

Over 1K World owners choose to publicly list their Worlds on the Places page, making them easier to discover. Browse through them and filter by categories to find the perfect World for your daily adventure.

![](/files/9iaLfBDmLrri3vaf6v5o)

Events can also be hosted in Worlds—attending them you can make friends and explore! Below is an example of an event hosted in a World. By the ruby 'jump in' arrow, you can see the World's name in place of Genesis City coordinates.

![](/files/GsuU1hm9hNKjbRve8Lve)

### Teleport to a World

If you know the name of a World, you can teleport to it using a **Chat Command**. Just put the following command into the Nearby chat box (in the bottom left of your screen) and hit \[**Enter**].

* `/goto World'sName` (e.g. `/goto officehours`)
  * Learn more about Chat Commands [**here**](/in-world/shortcuts-and-chat-commands#chat-commands).


# Settings & Performance

Settings & Performance in Decentraland

When you're in-world, look for the gear icon in the sidebar menu to access Graphic, Sound, Control, and Chat settings.

## Optimizing Decentraland's Performance on Your Device

Rendering Decentraland's open world requires a certain level of technical power. If your computer doesn't meet the minimum requirements listed below, you may experience poor performance and long loading times. In this scenario, you can try to optimize Decentraland's performance by lowering your Graphic settings in-world.

### **Windows**

|         | Minimum Required                                                          | Recommended Settings                              |
| ------- | ------------------------------------------------------------------------- | ------------------------------------------------- |
| OS      | Windows 10 64-bit                                                         | Windows 11 64-bit                                 |
| CPU     | Intel i5 7th generation or AMD Ryzen 5 Series                             | Intel i7 12th generation or AMD Ryzen 7 Series    |
| GPU     | Nvidia RTX 20 Series or AMD Radeon RX 5000 Series (DirectX 12 compatible) | Nvidia RTX 30 Series or AMD Radeon RX 6000 Series |
| VRAM    | 6 GB                                                                      | 12 GB                                             |
| RAM     | 16GB                                                                      | 32 GB                                             |
| Storage | 8GB HDD                                                                   | 20GB SDD                                          |

### **Mac**

|         | Minimum Required                                 | Recommended Settings               |
| ------- | ------------------------------------------------ | ---------------------------------- |
| OS      | macOS 11 Big Sur                                 | macOS 12 Monterey                  |
| CPU     | Apple M1                                         | Apple M1 Pro/M2                    |
| GPU     | Apple M1 integrated GPU (Metal support required) | Apple M1 Pro/M2 Pro integrated GPU |
| VRAM    | 6 GB                                             | 12 GB                              |
| RAM     | 16GB                                             | 32 GB                              |
| Storage | 8GB HDD                                          | 20GB SDD                           |

### Adjusting Graphic Settings

If your computer doesn't meet all of Decentraland's minimum hardware requirements, you can try to optimize your experience by lowering your graphic settings in-world. Here are the settings for best performance:

![](/files/tHwT7UTZ45V32qLvHXsy)

## Sound Settings

Modify the volume of individual sounds to customize your Decentraland experience:

* **Master:** Affects all sounds
* **UI SFX:** Affects the music that plays when you're logging into Decentraland
* **In-World Music & SFX:** Affects music, audio from streams, and any other sound effects generated by a scene
* **Avatar & Emote SFX:** Affects sounds from avatars and Emotes with sound effects

![](/files/VgZLEneHNA07l4vaD3f7)

## Control Settings

Here you can modify the sensitivity of your mouse in-world.

![](/files/t8zZKN059AGzn5XB60PD)

## Chat Settings

From the main settings, you can modify notification and chat bubble preferences for all your chats simultaneously as well as your DM permissions. See the [**Chat**](/in-world/friends-and-chatting#chat-settings) section for a full breakdown.

![](/files/FPo6Leb2VniHK2PM68NF)


# Shortcuts & Chat Commands

Shortcuts & Chat Commands in Decentraland

![](/files/2LQR3qbrpXhVEoQbwsMy)

## Keyboard Shortcuts

In addition to using the WASD or arrow keys to move your avatar around Decentraland, your keyboard can do a lot more for you when you're in-world. All the keyboard shortcuts are shown above. You can pull up this graphic in-world whenever you need it, just click the keyboard icon in the sidebar menu.

**Remember these shortcuts:**

* \[**B**]: Open Emote Wheel
* \[**Shift**]: Run while moving
* \[**C**]: Open Camera
* \[**K**]: Open Photo Gallery
* \[**U**]: Show/Hide UI
* \[**N**]: Show/Hide nametags

## Chat Commands

When you're in-world, you can always see a chat bar in the lower left corner of your screen. This is where you can access chats with your friends, as well as the **Nearby Chat**. Identifiable by the Decentraland icon, Nearby Chat is where you can chat freely with people around you in-world, even if you aren't friends. The Nearby Chat can also be used for entering Chat commands that only you will see.

Chat commands are specific strings of text used to trigger actions, such as teleporting or reloading. To use one, type the command in the Nearby Chat, and hit \[**Enter**].

* **Teleporting around Genesis City** `/goto x,y` (e.g. `/goto 0,0` for Genesis Plaza)
* **Visiting Worlds** `/goto World'sName` (e.g. `/goto officehours`)
* **Reloading a Scene** `/reload`
* **Open Debug Mode (shows FPS and other metrics)** `/debug`
* **Discover More Chat Commands** `/help`

![](/files/TIr0hTXE5x5OgQtb2D9C)


# Marketplace

Meet the LAND marketplace

The Marketplace is the go-to place to trade and manage all your Decentraland assets like Wearables, Emotes, LAND, and more.

Access the Marketplace at <https://decentraland.org/marketplace/>.

The Marketplace allows you to:

* **Sell** parcels and Estates of LAND, Wearables, Emotes and unique NAMEs. Set your own price in MANA and an expiration date for the listing.
* **Buy** parcels and Estates, Wearables, Emotes, and unique NAMEs for sale.
* **Transfer** your Decentraland assets to another user.

## Logging In

You can freely navigate the Marketplace without the need to log in, but it's recomended to log in while browsing the Marketplace for an enhanced experience. If you want to log in, you can use any of the available options like Gmail, Discord, or using Wallets like Metamask.

{% hint style="warning" %}
**📔 Note**: If you would like to use your Ledger hardware wallet in the Marketplace, it will require you to connect it to MetaMask. Please ensure you follow all the [given steps](https://support.metamask.io/more-web3/wallets/how-to-connect-a-trezor-or-ledger-hardware-wallet/) and updates to allow a seamless Ledger usage.
{% endhint %}

## LANDs Map View

The Atlas view gives you a bird's-eye perspective of every color-coded parcel, Estate, road, district, and plaza in Decentraland.

![](/files/VbG5RdhqZK9c3UZXapDV)

You can click and drag the map to move around, zoom in and out, or hover your cursor over a parcel to see its x,y location and owner.

Any parcel that is currently for sale or rent in the Marketplace will be highlighted.

Click on a parcel to view its status, coordinates, and owner's public wallet address (if it has an owner). From the map view, you can click on any LAND to go to see its details, buy it, make an offer to buy it, and even rent it.

## Browsing

Select the **Collectibles** tab to see all the items that are for sale.

* Select the **Category** to view all the Wearables and Emotes types.
* Use the **Search bar** to find Wearables, Emotes, Collections, and Creators.
* **Sort** results by different criteria like most recent, cheapest, using the drop down on the top right.
* **Filter** items by name, rarity, price, and more to find exaclty what you are looking for.

## Buy MANA or Pay With Your Local Currency

You can purchase Wearables, Emotes, and NAMEs with debit or credit cards, or with bank transfer (availability depends on your location). Or you can buy "Ehtereum MANA" to purchase LAND, NAMEs, and some special Wearables. Or you can buy "Polygon MANA" to purchase most Wearables and Emotes.

**To buy MANA**

1. Click **BUY MANA** on the top right.
2. Choose the type of MANA you want to buy (depending on the item you wish to get).
3. Choose a provider and follow the steps. You might need to perform a light or full KYC process.
4. And you are ready to get some amazing items.

## Buy items

To buy LAND, Wearables, Emotes or NAMEs in Decentraland:

1. Browse listings to find something that you'd like to buy and click it to open its details.

{% hint style="info" %}
**💡 Tip**: For LAND and Estates, you can also browse using the *Atlas* view.
{% endhint %}

2. On it's details page, click **Buy with Crypto** or **Buy with Card**.
3. Confirm this transaction following the steps.

{% hint style="warning" %}
**📔 Note**: If this is your first time buying something on the Marketplace, you might be asked to confirm a one-time transaction to allow the Marketplace to operate with your MANA, **this has no cost and it never will**.
{% endhint %}

## Make an offer for an item

If an item isn't listed on sale, you can still place a *bid* on it and offer to buy it at a specific price. The other steps of the process are just like those of buying an item.

{% hint style="info" %}
**💡 Tip**: View items that aren't for sale by untoggling the *On sale* option. For LAND and Estates, you can also browse using the *Atlas* view and select any parcel.
{% endhint %}

{% hint style="warning" %}
**📔 Note**: If this is your first time placing a bid on the Marketplace, you will also be asked to confirm a one-time transaction to allow the Marketplace to handle bids.
{% endhint %}

To view a list of your open and pending bids, select *My Assets* > *Bids* on the tabs above.

## Sell a parcel or Estate

To sell one of your items:

1. Open **My Assets** and open its details page.
2. In the details page, click **Sell**.
3. Set a price and expiration date and click **List for sale**. Then retype the price you're selling it at to confirm.
4. Confirm this transaction on your wallet and wait for the network to verify it.

{% hint style="warning" %}
**📔 Note**: If this is your first time selling an item of this asset type on the Marketplace, you will also be asked to confirm a one-time transaction to allow the Marketplace to accept MANA.
{% endhint %}

You can change the price of a sale that you already put on sale without having to cancel and re-create the listing. Just click **Update price** in the parcel or Estate's details page.

## Transfer LAND

To transfer a LAND parcel or Estate to another user:

1. Open **My Assets** and open the details page of the parcel or the Estate you'd like to transfer and click **Transfer**.
2. Enter the public address of the Ethereum wallet of the recipient.

{% hint style="warning" %}
**📔 Note**: Please double check this address, since you cannot cancel the operation. While the recipient could always transfer the LAND back to you, the original owner cannot reverse the action.
{% endhint %}

3. Click **Submit**.
4. Confirm this transaction on your Ethereum client and wait for the network to verify it.

{% hint style="warning" %}
**📔 Note**: If the LAND parcel or Estate is currently on sale, you won't be able to transfer it. First click **Remove listing** to cancel the sale.
{% endhint %}

## Providing Feedback

We've worked hard to ensure that the Marketplace is simple and easy to use but if you ever have questions or feedback please reach out to us by clicking on the Feature Request link in the footer.

As with all of our other tools, the Marketplace is open-source software, and [you can find the code here](https://github.com/decentraland/marketplace). Feel free to create an issue, or submit a pull-request!


# LAND Manager

Manage LAND and Estate tokens

The Land Manager allows you to manage your LAND and Estate assets.

Access the Land manager at <https://builder.decentraland.org/land>.

The Land Manager allows you to:

* **Name** your parcels and Estates and give them a public description.
* **Merge** LAND parcels into an Estate.
* **Dissolve** an Estate into separate LAND parcels.
* **Transfer** your parcels and Estates to another user.
* **Grant permissions** to other users to edit the parcels you own.

## Manage Your LAND

To view your LAND tokens, click **Manage your LAND**. Here you'll find a list of all of your parcels and Estates, including any parcels that you have listed for sale.

By clicking on one of the parcels or Estates listed under **Land**, you can edit its name, description, set an operator, or transfer it directly to another wallet address.

![](/files/zl0lbBnnhhoVSB42NnGb)

## Create an Estate

LAND Estates make it possible to associate two or more directly adjacent parcels of LAND to make it easier to manage your larger LAND holdings. Estates are especially useful when building larger scenes that span more than one parcel.

Parcels in an Estate must be directly adjacent, and cannot be separated by a road, plaza, or any other parcel.

To create your first Estate, you need to own two or more adjacent LAND parcels.

1. Open **My LAND** and select one of the parcels you'd like to add to the Estate.
2. In the parcel's details page, click **Create Estate**.
3. You will be shown a view of the Atlas centered on the parcel you selected, with the remaining adjacent parcels you own highlighted. Select the different parcels you want to include in your Estate. ![](/files/tzDGdnjmGGFyn4MkkpgK) ![](/files/dXwr0qQKiQ3sNSzyGX9C)
4. Click **Continue**.
5. Enter a name and description for your Estate. These details will be publicly displayed in the Atlas, just like the name and description for any individual parcel.

   ![](/files/wPdmLENrz1nD4ssgBMtU)
6. Confirm this transaction on your Ethereum client and wait for the network to verify it.

Once you've created your first Estate, you will see a new tab titled Estates. From this page you can view and manage all of your Estates.

When you create a new Estate, you are effectively transferring your parcels to a new token. These Estates are represented by ERC721 tokens (like any other NFT). You will no longer see the individual parcels under *My LAND*, and they will not appear in MetaMask, Mist, Trezor, or Ledger wallets, nor on Etherscan under your address.

## Edit parcels or Estates

You can edit the name and description of any parcel or Estate that you own. These details will be publicly displayed in the Atlas.

To edit a parcel or Estate:

1. Navigate to the details page of the parcel or the Estate you'd like to edit and click **Edit**.

   ![](/files/hxrr95aNQ9KT1Q9GrWR2)
2. Click **Submit**.
3. Confirm this transaction on your Ethereum client and wait for the network to verify it.

## Give permissions

You can give another user permissions to edit the content in a parcel or Estate. This enables that user to deploy code to the scene, whilst not having the ability to sell the token.

The user given permission can also change the name or description in the Marketplace.

To grant permissions over your LAND:

1. Navigate to the details page of the parcel or Estate and click on the three dots and then **Set Operator**. ![](/files/IETyCnF1FlmdTcJrH2E8)
2. Fill the form with the desired info.

   ![](/files/mtkUWmikLZui4FO1ZfLi)
3. Click **Submit**.
4. Confirm this transaction on your Ethereum client and wait for the network to verify it.

## See your activity history

Open the notifications page by clicking the bell icon at the top of the screen.

![](/files/cqhy69XmzWPqSPT96Ts6)

The notifications page displays a list of all the recent transactions that you have carried out, together with their status.

Click a transaction to see more details about it on Etherscan.

## Transfer LAND

To transfer a LAND parcel or Estate to another user:

1. Navigate to the details page of the parcel or the Estate you'd like to transfer and click **Transfer**.

   ![](/files/3uqlLHWCoYUt1Iq45lUg)
2. Enter the public address of the Ethereum wallet of the recipient.

{% hint style="warning" %}
**📔 Note**: Please double check this address, since you cannot cancel the operation. While the recipient could always transfer the LAND back to you, the original owner cannot reverse the action.
{% endhint %}

![](/files/yxCbCrNk03lRccCkq36K)

3. Click **Submit**.
4. Confirm this transaction on your Ethereum client and wait for the network to verify it.


# Rentals

LAND Rentals

## Glossary

**Land Owner:** Account (address) that owns LAND, it could be a Parcel, an Estate, or both.

**Tenant:** Account (address) that rents LAND from a LAND Owner. This is also the only Account that can change the Address that has Operator Permissions.

**Operator Permission:** The address with this permission is the only one that can deploy scenes in that LAND.

**Transactions:** Ethereum Blockchain transactions that cost gas.

## Intro

The new Renting System allows LAND Owners and Tenants to **Rent LAND in a secure and trustless way** by using a combination of signatures that are stored in a server handled by the Decentraland Foundation (off-chain) and Ethereum transactions (on-chain).

For instance, a DJ could find a cool plot of LAND, rent it and deploy a nightclub to play every Saturday. A University could rent an Estate and build a campus for its students.

Below you will find all the steps you need to follow to Rent a LAND, and the transactions involved for both parties.

## For LAND Owners

### List LAND for Rent

As a LAND Owner, you can list your LAND (Parcels or Estates) for Rent in the [Marketplace](https://market.decentraland.org/) > My Assets > LAND.

In order to do this on-chain, the LAND Owner has to approve the Rent Smart Contract to use the LAND on their behalf. Then every listing would need a signature from the Owner as well.

![](/files/oA58VfH5bfolyDEqfJjC)

You can set a rental price per day in MANA and the amount of days you want to allow people to rent it. The price per day times the number of days in the period is what the tenant will pay **upfront, and in total** for that rent.

![](/files/YOXA3ZKSBF8hQYwVpyTV)

After defining the Price per Day, you need to select the number of days that Users can rent your LAND. For example, if you select 7 and 30 days only, the Tenant can only choose between those 2 options. In case 30 days option is selected by the Tenant, that would be the duration of the rent from the day it is confirmed.

![](/files/r7fAGwsPNTX8OtpEQ08Z)

You can also set an expiration date for the listing. This means that, if the LAND wasn't rented until the selected date, the listing will be removed from the Marketplace. Also, the smart contract will reject the expired signature so that no one can rent it for the listing price and duration previously selected. This is a security measure to prevent it to be rented for an undesired price or duration.

![](/files/tZjiUHD2WJQPPXF4N9lX)

After the price, rent period and listing expiration date are set, your LAND will appear as available for rent in the Marketplace.

{% hint style="info" %}
💡 When LAND is rented by a Tenant, it can not be sold until it's claimed back. Bids from potential buyers can not be received either.
{% endhint %}

{% hint style="info" %}
💡 Voting Power is kept by the LAND Owner, even if it is rented.
{% endhint %}

### Edit or Cancel a Listing

After the LAND is Listed for Rent in the Marketplace, and before anybody rents it, you can edit the conditions of the Listing by clicking on the pencil icon in the LAND detail. You can also remove the Listing from the Marketplace and the blockchain.

![](/files/1ZKkPW7H8PYWIY6TpCaW)

{% hint style="info" %}
💡 Edit and cancel require a transaction, which costs gas. See Transactions section below for more details.
{% endhint %}

### After the Rent is over

After the Rent is over, you can either **Claim your LAND Back, or List it for Rent Again**.

**Operator Permissions are not transferred automatically back to the LAND Owner**. In order to get them back, the LAND Owner has to Claim the LAND back by sending that transaction and paying for the gas fee. Confirming the transaction will take out Operator Permissions from the Tenant and give them back to the LAND Owner.

![](/files/pZW4mexcAx3OMLKYNxp9)

The other possibility is to List the LAND for Rent Again, instead of claiming it back. This will not require paying for another transaction, but **Operator Permissions will be kept by the previous Tenant until a new Tenant confirms a new Rent.**

The LAND Owner can edit the price, rent period, and listing expiration date for the new listing.

![](/files/WZ8N6MrodnCnivBs8whW)

Both actions can be done from the LAND detail page in the Marketpalce.

![](/files/b3gAznhaYBvHt8slmzRw)

### Renting Status

You can check the Status of any rented LAND in My Assets > Store > On Rent. The possible status are:

* Listed for Rent - The listing was confirmed and it's available for users to rent in the Marketplace
* Rented Period Over - At this stage, the LAND is available to Claim Back or List Again for Rent by the LAND Owner
* Rented until *"date"* - The LAND is already rented and the Tenant has Operator Permissions until it's claimed back or rented by another user

![](/files/9qudIVJa77F0cCIQIBc2)

## For Tenants

### Rent LAND

All users can find LAND listed for rent in the Marketplace under the LAND section.

![](/files/lfqzoLX7cHzATUQ8JCd7)

There are LANDs that are available for Sale or Rent. In case both options are available, you can see the conditions available for each one by clicking on the toggle Sale/Rent.

![](/files/ThvU5g1sv74IPuOquk3R)

Once you find the LAND you want to rent, you need to select the Rent Period, this is the days you will have the LAND. After selecting the Rent Period, you will see the total price to be paid for the Rent.

![](/files/cPjHyJrHcjOixknd1y3B)

You'll need to approve the Rent Smart Contract to take the MANA from your account before you proceed.

Before you confirm the Rent, you can decide who will manage the LAND (Operator Permission). It can be yourself or any other address you choose.

![](/files/xSY51D4GCWY65AToRb1r)

Operator Permission can be changed later by the Tenant (the address who rented the LAND in the first place) from the [Builder](https://builder.decentraland.org/).

![](/files/DlApA5GsmIlXRnv22223)

After selecting all the details and approving the Rent Smart Contract to handle your MANA, you can confirm the Rent by sending a transaction.

And you are all set! you can start working on your LAND, and deploy a scene using the Builder or the SDK.

![](/files/6Ik1XnzwJvsZ7WXY8Qgs)

Note: after the Rent ends, the Tenant will still have Operator Permissions until the LAND Owner Claims it back, or somebody else rents it. **Make sure you save your content before the end of the rent, otherwise it could be lost.**

{% hint style="info" %}
💡 Renting LAND does not transfer Voting Power to the Tenant. Voting Power is kept by the LAND Owner as defined by the DAO in this [Proposal](https://governance.decentraland.org/proposal/?id=c98bd010-74b1-11ed-a9bf-f772a12a0556)
{% endhint %}

## Transactions

For the sake of **security and decentralization**, the Renting system relies on the Ethereum blockchain as a source of truth.

But, not every action involved requires an entry in the blockchain. If that was the case, it would be too expensive for both parties.

Transactions in the blockchain are minimum in order to provide a **robust and trustless system for LAND renting while keeping it affordable.** These are all the transactions to consider:

### For Land Owners

#### List for Rent

Before Listing the first Parcel or Estate for rent, LAND Owners need to allow the Rents Smart Contract to operate LAND on their behalf. This has to be done only once for Parcels and only once for Estates.

![](/files/TOJGSGQcVuNpOAnmi9LJ)

#### Claim LAND Back or List for Rent Again

After the renting period ends, **Operator Permissions are not transferred automatically back to the LAND Owner**. In order to get them back, the LAND Owner has to Claim the LAND back by sending that transaction and paying for the gas fee.

![](/files/9Bl0orTAxMcidwAdEAr6)

Another possibility is to List the LAND for Rent Again, instead of claiming it back. This will not require paying for another transaction, but Operator Permissions will be kept by the previous Tenant until a new Tenant confirms a new Rent.

#### Edit Listing

If either the Price, Rent Period, or Expiration Date is changed, a transaction has to be sent by the LAND Owner in order to protect themselves from somebody using the previous listing signature on the Smart Contract directly (not from the Marketplace UI) and getting it from a lower price than desired or for an undesired duration.

![](/files/fJdmfyIJp4nJEYVDFXY2)

### For Tenants

#### Allow Rent Contract to operate your MANA

Whether it's a Parcel or an Estate, every user that wants to Rent LAND has to send one transaction to allow the Rent Smart Contract to operate MANA on their behalf. This is needed because the Smart Contract has to pull the MANA and transfer it to the LAND Owner when the rent is activated. This is done only once for all LAND to be rented from that moment onwards.

#### Rent LAND

After approving the Rent Smart Contract to operate your MANA, you are ready to confirm your first Rent. Once you find the LAND you want, choose the rent period, and confirm the Rent transaction, Operator Permissions are transferred to the selected address.

If you want to rent another Parcel or Estate, you only need to send one transaction to confirm it, there is no need to approve the Smart Contract to operate your MANA again.

![](/files/hvxdQEttAf3zaOzJ5cNQ)

#### Change Operator

At the moment of renting the LAND, the user can choose which address will have Operator Permissions for that LAND. If that address wants to be changed, a transaction has to be sent.

![](/files/5hr0EGPSK5MeP35HSN6E)

## Smart Contract Wallets

The Rentals feature relies heavily on off-chain signatures. Off-chain actions allow Land Owners to list LANDs for rent without paying the transaction cost.

By signing a listing, the Rent Smart Contract can verify that the listing was created by the signer.

Signing has the particularity that it requires a private key. All EOA (Externally Owned Accounts) have one, and they can sign listings with it. The Rentals Smart Contract will then verify the EOA generated signature when executing a rental.

Smart Contracts Wallets, which are Smart Contracts. Do not have a private key, thus, they are unable to sign messages. Instead, an EOA authorized by the Smart Contract Wallet has to sign.

To support these signatures, the Rent Smart Contract verifies with the Smart Contract Wallet if the signature is valid by following the [EIP-1271](https://eips.ethereum.org/EIPS/eip-1271) standard. If the signature is valid, the rental can be executed.

The Smart Contract Wallet not only has to have the standard signature verification method defined in the EIP-1271 but also the token receiver method defined in the [EIP-721 standard](https://eips.ethereum.org/EIPS/eip-721). This is required while claiming LAND back because the Rent Smart Contract will call a `safeTransferFrom` to return the NFT to the Smart Contract Wallet, and if it has not implemented the appropriate `onERC721Received` function, it will fail to recover the LAND.


# Get a Wallet

Decentraland uses the Ethereum blockchain to record the ownership of all digital assets and tradable items.

## What is a wallet?

Decentraland uses the Ethereum blockchain to record the ownership of all digital assets and tradable items.

![](/files/NdtYTbaxWdd24F2eNlK8)

Digital wallets are tools that work as a bridge between the blockchain and the dApp (decentralized applications). This means that with a wallet you will be able to monitor your available funds, transaction history and security options.

## Do I need a wallet to play in Decentraland?

No, you do not need to own crypto or already have a digital wallet to use Decentraland. Decentraland is free to use, and if you'd like to purchase something from the [**Marketplace**](https://market.decentraland.org/), you can use a credit/debit card in addition to cryptocurrency.

See a tutorial for [**making an account with a social profile**](https://www.youtube.com/watch?v=ylZrPisyPl4) or [**with an external wallet like MetaMask**](https://www.youtube.com/watch?v=w3CCVrVe1M4).

## How do I get a digital wallet?

To enter Decentraland, you must use a wallet that is integrated to your web browser, so we recommend you [MetaMask](https://metamask.io/)

![](/files/xLB5Z3jAKJl2N1V0ZkPz)

Once you install it, you will see an icon like this:

![](/files/n3GUiITVPQ4G7LNYG0XS)

## Wallet address

All wallets have a public and private key. A public key Is a unique identifier for your wallet and it looks like this: **0xcba113f589805095a892ecefdb4eb83eff45d98**. It is basically a name that you can share freely with others and it's used to direct assets to your wallet.

You can localize your wallet address clicking on the extension icon in your browser, and then clicking on your wallet name with the public key to copy it to clipboard:

![](/files/QAszJrlRWILw8CzwV2JY)

Or by clicking on your account details:

![](/files/uqFQkkq7GpoY9ar3QBPD)

The private key is used by your wallet to sign each transaction and certify that it was truly sent by you. It is also used to restore your wallet in case you forget your password.

Keep in mind that a digital wallet is like a bank account, so make sure you **don't forget your password, or backup phrase. Keep them in a safe place and don't share them with anyone.**

## What is Ether (ETH), and how do I send it to my wallet?

![](/files/EIFINIVNQeNU1bEugMM3)

For executing transactions, you'll need to put money in your wallet. dApps based on Ethereum, like Decentraland, use Ether: a digital currency that powers the Ethereum network. It acts like any other currency, in that its value fluctuates with the market.

* You need to convert your currency (e.g. USD, CAD, GBP) into Ether to pay for things such as a collectibles.

## How do I get Ether?

*For US citizens only:*

You can purchase ETH for the MetaMask Browser Extension with the Coinbase service.

* Click the `Buy` button.
* Select the `Coinbase` option.
* Click the `Continue to Coinbase` button to purchase Ethereum.

*For the rest of the World:*

You need to buy ETH from Coinbase or another exchange using normal fiat currency.

* Copy your MetaMask address by clicking on your name account and address.
* Select `Copy Address to clipboard`.
* Go to Coinbase or another exchange.
* Click `Accounts` in your top navigation.
* Select your ETH wallet and click `buy`.
* Follow the steps to `Add payment method` and paste your MetaMask address with the amount you'd like to transfer.

## What is MANA and how do I get it?

![](/files/ITMxJbekmX8fkrXzpU8V)

[MANA](https://etherscan.io/token/decentraland) is Decentraland's fungible (reproducible or interchangeable) cryptocurrency token. It is burned, or spent in exchange for LAND parcels, wearables and names.

Steps to buy MANA:

* First, you need to register with an exchange that lists MANA (such as [Coinbase](https://www.coinbase.com/), [Huobi](https://www.huobi.io/), [Binance](https://www.binance.com/)).
* Secondly, you will need to deposit funds into your account. While things change rapidly in the crypto world, it's not likely that there's an exchange available to convert your USD directly for MANA. If that's the case, you'll first need to obtain a cryptocurrency listed in a currency pair with MANA, such as Ether (ETH), and then exchange it for Decentraland's native token.
* Third, once logged into your exchange account, click on the "Markets" or "Exchange" link and search for your desired currency pairing. For example, MANA/ETH. In the "Buy" field, you can then specify the amount of MANA you want to buy or the amount of ETH you want to spend. Make sure you take a moment to review the full details of the transaction including any fees that apply and the total cost of completing your purchase.

## What is 'gas'?

'Gas' is a shorthand term used to describe the cost of powering a transaction or contract in Ethereum. Because blockchain is decentralized, every transaction is distributed through multiple computers, not a central server. This ensures each token – in this case, each collectible – is secure and one-of-a-kind. It also takes a lot of computational power, which is covered by the cost of gas.

* *'Gas' is composed of two parts: Gas Price and Gas Limit. Gas Price is what you offer to pay the miners (in a tiny measurement of ether called 'gwei') for each operation to execute the smart contract. Gas Limit is how many operations you let them do before they run out of gas and drop the transaction.*
* *1 gwei = 1/1,000,000,000th of an Ether.*

![](/files/0B8XuhQUl7YR2sB2tyCx)

To summarize, Gas Price (gwei) is the amount of Ether offered per gas unit to pay miners to process your transaction. The higher the gas price you set, the faster your transaction will get processed. So, for more important transactions – such as a collectible that you really like ;D – think about increasing the suggested gas price.

**For extra technical information, visit** [**About the blockchain**](/blockchain-integration/ethereum-essentials)


# About the Blockchain

How Decentraland uses the Ethereum blockchain.

All blockchains are in essence decentralized databases that are distributed among the machines of a network. Transactions are grouped into "blocks" and processed sequentially to form a *chain* of events.

Ethereum is one of the most popular blockchains. What sets it apart from others, such as Bitcoin, is that it uses the blockchain as storage for more than just a record of currency transactions. Ethereum can store more complex information to distinguish different kinds of tokens or even handle unique tokens with specific characteristics. The Ethereum blockchain also runs smart contracts, these allow to execute more complex transactions that can also depend on agreed upon events.

Decentraland uses the Ethereum blockchain to record the ownership of the digital assets, and other tradable items that can be read and reacted to by a 3D scene.

The blockchain isn't used to store the scene state, player position or anything that needs to change in real time as a player interacts with a scene, all of that is either stored locally on each player's machine, or on a private server owned by the scene owner. The developers of each scene must choose what information is worth storing on the blockchain, and what to store in a private server.

## Wallets

Ethereum tokens are held by wallets. An Ethereum wallet can hold various tokens, including Ether, MANA, LAND, and other tokens that may be used by games or experiences in Decentraland.

There are many wallet providers where you can hold Decentraland tokens. To use the Marketplace, or to enter Decentraland, you must use a wallet that is integrated to your web browser, so we recommend that you use:

* [Metamask](https://metamask.io/)
* [Trezor](https://trezor.io/)/[Ledger](https://www.ledger.com/) hardware wallets

Every wallet has a public and a private key. The hash of your public key is your wallet's unique address, used to route transactions and identify a player. Your private key is used by your wallet to sign each transaction that you send to the network and certify that it was truly sent by you. Your private key is also used to restore your wallet in case you forget your password, so keep it in a safe place and don't share it with anyone.

In Decentraland, player identities are built around wallets. Since wallet public keys are unique, your scene can use them to identify a Decentraland user in a persistent way. Wallets can also hold different tokens that can give a player a unique avatar, a wearable item, permissions to enter scenes that choose to restrict access, a special weapon to use in a game, etc.

## Transactions

Transactions make changes to the information that's stored in the blockchain. Typical transactions involve tokens changing owners, for example user A giving his LAND token to user B in exchange for an amount of MANA tokens. In the Ethereum network, however, a transaction can also mean changing the information that's stored about a token without changing its owner. For example, changing the description of a parcel, or merging several parcels into an Estate.

All transactions that occur in Ethereum's main chain have a cost that is paid in Ether tokens. This fee is referred to as the 'gas' fee, and it's paid to the network user that 'mines' the transaction.

When you request a transaction to take place, you set the gas price that you're willing to pay for the transaction to be mined. Transactions that offer higher prices get mined faster, since miners give these priority. Market prices for these transactions oscillate regularly, they tend to be more expensive when there is a higher usage of the network. Make sure that what you offer isn't below the market price, otherwise your transaction could remain in an unprocessed pool indefinitely.

All transactions must be signed by an Ethereum address, using the addresse's private key. This is what certifies that the transaction was carried out by that address.

#### Transaction validation

Blockchain transactions aren't immediate, they require time to be "mined" by one of the nodes in the network, and then to be propagated throughout the rest of the machines. The more transactions that are being requested by the network, the more time they take to be validated.

In brief terms, this is how a transaction is validated:

1. A new transaction occurs, it goes into a pool of unconfirmed transactions.
2. One of the machines in the network successfully solves an algorithm to mine a new "block" containing a handful of transactions from this pool, including this one. It attaches this new block to the end of the chain.
3. The block is shared with other machines of the network. Each machine verifies that each transaction in a block is valid and checks the block's hash to ensure it's legitimate, then it adds it to its own version of the chain.
4. The new block is propagated throughout the whole network. There's a universally shared understanding that this transaction has taken place.

#### Sidechains

Decentraland is partnering with [Matic](https://matic.network/) to create a *sidechain* (a special kind of blockchain) that will be able to handle transactions faster and cheaper than the main Ethereum network. This sidechain will be ideal for in-game transactions, as changes can occur closer to real time and at a very low cost. For transactions that involve valuable items, we'll still recommend the main Ethereum chain, as it will be more secure.

Each developer working on a scene will be able to choose whether to use the mainchain, the sidechain or a combination of both for different transactions.

The sidechain will be kept interoperable with the Ethereum's mainchain. You'll be able to load tokens from the main chain into the side chain and vice versa. Transactions that take place in the sidechain are eventually reflected in the mainchain when the tokens "exit" back into the mainchain.

#### Trigger transactions from a scene

Your scene's code can trigger transactions, both on the Ethereum mainchain and on Decentraland's sidechain. You could have a store in your scene that sells tokens (like NFTs), or have a game that rewards game items to players that achieve certain goals.

The user must always approve these transactions explicitly on their Ethereum client. For example, when using Metamask, Metamask prompts the user to accept each transaction before it's processed.

## Types of tokens

Different types of tokens can be handled in the Ethereum network. A few standards have emerged that group tokens that share the same characteristics.

In Decentraland, you can use tokens to represent items that relate to your game or experience, such as a weapon or a trophy. As tokens are held in a player's wallet, they accompany a player from scene to scene, so each scene can choose if and how they want to react to every existing kind of token.

Read [What are NFTs](https://decentraland.org/blog/technology/what-are-nfts/) on our blog for a more in-depth look at the emergence and evolution of non-fungible tokens.

#### Fungible tokens

If an item is fungible, then it can be substituted or exchanged for any similar item. Fiat currencies, like the US dollar, are fungible. One dollar bill can be exchanged for any other dollar bill.

Cryptocurrency tokens like Bitcoin, Ethereum, and MANA are all fungible because one token unit can be exchanged for any other token unit.

You could also create custom fungible tokens to use in Decentraland scenes and use them to depict items that are all equal and have no distinctive or customizable properties between them. You could, for example, create a game that revolves around collecting a large quantity of identical items, and represent these through a fungible token . You could also use a fungible token to represent a golden ticket that gives players who hold it access to a specific region or service.

*ERC20* is the most accepted standard for fungible tokens in the Ethereum Network. MANA is built upon this standard.

#### Non-Fungible tokens

Non-fungible tokens (or NFTs) have characteristics that make each unit objectively different from others. Parcels of LAND in Decentraland are NFTs, as the location of each parcel is unique. The adjacency to other parcels, roads, or districts make these locations relevant to token owners.

In Decentraland, you can use NFTs to represent in-game items such as avatars, wearables, weapons, and other inventory items. You could, for example, use a single type of NFT to represent all weapons in your game, and differentiate them by setting different properties in these NFT.

NFTs can be used to provide provably scarce digital goods. Because of the legitimate scarcity made possible by the blockchain, buyers can rest assured that the art they purchase is, in fact, rare. This gives digital art real value that we've never seen before.

Game items will have a history that's stored in the blockchain. This history could deem an item more valuable, for example if it was used to accomplish great achievements or used by someone who's admired.

Depending on the contract describing the token, each NFT could either be immutable, or you could allow players to customize and change certain characteristics about them if they choose to.

*ERC721* is the most accepted standard for non-fungible tokens in the Ethereum Network. LAND tokens follow the ERC721 standard.

## Smart Contracts

A contract consists of a both code (its methods) and data (its state) that resides at a specific address on the Ethereum blockchain.

The methods in a contract are always called via a transaction that has the *to* field set to the contract's address. The code that's executed by the contract's method can include calls to other contracts, these trigger more transactions that have the *from* field set to the contract's address.

A contract can't trigger any actions on its own or based on a time event. All actions performed by a smart contract always arise from a transaction that calls one of the contract's functions.

You can use smart contracts to condition transactions based on custom conditions. For example, players could stake a bet on the outcome of a game, and the corresponding payments would occur as soon as the outcome of the game is informed to the contract.

The entire code for a smart contract is public to whoever wants to read it. This allows developers to create publicly verifiable rules.

All Tokens are defined by a smart contract that specifies its characteristics and what can be done with it. Decentraland has written and maintains a number of smart contracts. LAND and MANA tokens themselves are defined by the *LANDregistry* and *MANAtoken* contracts respectively.

You can find the address of every contract created by Decentraland in [Decentraland smart contracts](https://contracts.decentraland.org/addresses.json).

You can read the full code of each of those contracts, as it's public information on the blockchain. You can find the contract by name on [Etherscan](https://etherscan.io/contractsVerified) and read its content there.

## dApps

*dApps* (decentralized applications) are applications that are built upon smart contracts and the blockchain.

A dApp can be as simple as something that validates that your wallet holds a certain token and lets you use a service. Or it can be a fully fledged application with its own UI, such as the Decentraland Marketplace.

## Sepolia test network

Before you deploy a smart contract, create a new type of token, or a Decentraland scene that relies on transactions on the Ethereum network, you need to make sure that it has no bugs or gaps that malicious users could exploit.

The Sepolia test network is an alternative version of Ethereum that's specifically made for running tests.

Tokens in the Sepolia network have no real value, so you can afford to make mistakes without running any real risk. You can replenish any lost tokens for free by using a faucet:

* Sepolia Ether faucet (<https://www.alchemy.com/faucets/ethereum-sepolia/>)

If you're developing a scene that triggers transactions, testing these transactions in the Sepolia network is free, as the tokens you send don't have a value. In mainnet you would otherwise have to pay at the very least a real gas fee in Ether for each test transaction you carry out.

Once you're confident that your code works as expected and can't be exploited, you can deploy to the Ethereum mainnet.

## Blockchain reorgs

Occasionally, multiple machines will create alternative new blocks at roughly the same time. This is a problem, because this forks the chain into two diverging versions that could potentially contradict each other. When a fork occurs, Ethereum solves this by always giving priority to the longest chain and discarding any shorter chains. Even though it's possible for two rivaling chains to exist at the same time, soon one of the two chains will add another block and outgrow the other. Due to the time it takes to solve the mining algorithms, it becomes increasingly difficult for rivaling chains to keep growing in perfect sync with each other. Sooner or later one will prevail over the other.

When one chain outgrows the other and the dispute is resolved, machines that had adopted the shorter chain need to make adjustments. This is what's known as a "reorg". They need to roll back on all of the transactions included in the blocks from the branch they're in until they reach the point at which the fork occurred. Then they need to add the new blocks from the longer branch that's considered legitimate.

Rolled back transactions may return to the pool of pending transactions until they're picked up again by a miner (or are discarded). Any gas fees paid for these transactions are also rolled back.

Blocks that were just added to the end of a chain have a substantial chance of being rolled back because of the mechanisms explained above. As subsequent blocks are added to the end of the chain, it becomes less and less likely that the blocks that are further back in the blockchain could be rolled back, because that would require a larger reorg. Due to this, each new block that's added to the end of the chain after a transaction is called a confirmation for that transaction.

When creating applications (or scenes) that use information from off the blockchain, you should be aware of the occurrence of reorgs. You might want to only consider transactions as verified when a certain number of confirmations have occurred, and the transaction is no longer at the very end of the chain.

Using several confirmations will make the information very stable, but transactions will take a long time to be reflected.

Using few confirmations, changes will be reflected faster, but there will sometimes be hiccups that appear to undo transactions when reorgs occur. If these transactions have off-chain consequences in your scene, then you might need to somehow reverse these consequences as well.


# Transactions in Polygon

Frequently Asked Questions about Polygon transactions

## What is Polygon?

As stated in the the official Polygon website, [Polygon](https://polygon.technology/) is a protocol and a framework for building and connecting Ethereum-compatible blockchain networks. Aggregating scalable solutions on Ethereum supporting a multi-chain Ethereum ecosystem."

## What is Matic?

MATIC is Polygon's native token. It is a cryptocurrency used to cover gas fees in the Polygon network, among other use cases. MATIC is to Polygon as ETH is to Ethereum.

You can buy MATIC in most cryptocurrency exchanges.

## Polygon in Decentraland's Marketplace and Builder

By using the Polygon network, and thanks to Decentraland's DAO, users can list, sell and buy wearables in the Marketplace or publish their collections in the Builder without paying for the transaction gas using the meta-transactions services.

**Transactions in Polygon are not free**. The Decentraland DAO covers the cost of the transactions in Polygon so that users can enjoy many costless transactions in the Marketplace.

In order to enjoy costless transactions there are three conditions that need to be met:

* You need to be connected to Ethereum Mainnet.
* The item you are intending to buy needs to have a price of 1 MANA or higher.
* You didn't reach your free transaction limit.

The Decentraland DAO reserves itself the rights to consume or pause the meta-transactions services when the network's gas fees are high to prevent the consumption of the gas tanks so they can last longer and be used by as many people as possible.

## Why do I have to cover the transaction fees for items that cost less than 1 MANA?

In order to avoid exploitation and protect the free gas service, items that cost less than 1 MANA are not included in the costless transactions. You can buy these items by connecting to the Polygon network with MATIC in your wallet.

Gas fees are variable.

## What can I do if network fees are higher than 300 gwei?

Gwei is a unit of measurement used in the Ethereum blockchain. It is short for "Giga-wei," where "giga" denotes one billion. In Polygon, gwei is the smallest denomination of MATIC that is equivalent to 1/1,000,000,000 of 1 MATIC (1 MATIC = 1,000,000,000 gwei). All transaction fees on the Polygon network are denominated in gwei.

Network fees (exoressed ub gwei) are variable, so the best you can do is wait and try again at another moment. [Here](https://polygonscan.com/gastracker) you can check the Polygon Gas Fee in real time.

Alternatively, you can buy these items by connecting to the Polygon network to use the MATIC in your wallet to pay for the fees. The MATIC fee will be deducted automatically as part of the transaction fee of the Polygon network. You only need to be connected to the Polygon network and have MATIC in your wallet.

Gas fees are variable.

## What happens if the free transaction limit is reached?

The free transaction limit renews every day, so you can try the day after. Alternatively, you can cover the cost of your transaction with MATIC while being connected to the Polygon network.

The MATIC fee will be deducted automatically as part of the transaction fee of the Polygon network. You only need to be connected to the Polygon network and have MATIC in your wallet.

Gas fees are variable.

## Where can I get MATIC to pay for transaction fees?

One way to obtain MATIC is buying it through [the Account dapp](https://account.decentraland.org/).

Simply click on the BUY button in the Polygon MANA section, and exchange the crypto you want to purchase from MANA to MATIC.

Another way is through Decentralized or Centralized exchanges. You can check <https://polygon.technology/matic-token/> to see which exchanges operate with MATIC. If you want to use a Centralized exchange, make sure that it allows withdrawals through the Polygon network.

If you have MATIC in the Ethereum network, you can always use the [Polygon Bridge](https://wallet.polygon.technology/bridge/) to deposit that MATIC to the Polygon network.

{% hint style="warning" %}
**Warning:** After completing a transaction in Polygon, remember to switch back to Ethereum Mainnet to enjoy all the features in the Marketplace and the Builder that are not supported in the Polygon network.
{% endhint %}


# DAO User Guide

How to use the Decentraland DAO

## Table of Contents

* [Logging in](#logging-in)
* [Voting power](#voting-power)
* [Approval/Rejection Conditions](#approvereject-conditions)
* [Browsing proposals](#browsing-all-proposals)
* [Viewing a proposal](#viewing-a-proposal)
* [Adding proposals to your watchlist](#adding-proposals-to-your-watch-list)
* [Voting](#voting)
* [Participating in the Forum](#participating-in-the-forum-discussions)
* [Creating a proposal](#creating-a-proposal)
* [Proposal categories](#proposal-categories)
* [Deleting a proposal](#deleting-a-proposal)

## Logging in

To get started with the DAO, visit [governance.decentraland.org](https://governance.decentraland.org). You will be presented with a welcome screen and quick start tutorial.

After reading the quick start tutorial, click **Sign In**. You must connect a wallet in order to use the DAO. Currently, you can use either **Metamask** or **Fortmatic**. Make sure the wallet you're using holds the relevant tokens for participating in the DAO (MANA, NAMES, or LAND)

After connecting your wallet you will be taken to the homepage of the DAO featuring a list of all currently active proposals.

## Voting power

Voting power is calculated from the total balance of MANA, NAMES and LAND associated with the wallet connected with the DAO. **The DAO looks at both your wrapped and unwrapped balances, so you do not need to unwrap any MANA to achieve your full voting power.** However, you can unwrap any previously wrapped MANA at any time from the "Voting Power" tab. There is still a gas fee associated with unwrapping MANA as it is a transaction on the Eth mainnet.

Your vote in the Decentraland DAO is weighted according to the balance of MANA, NAMES and LAND associated with the account you log in with.

To view your current voting power, navigate to the **Voting Power** tab.

#### How is voting power calculated?

Voting power is represented as **"VP"**. MANA, NAME, LAND, and Legacy Wearables contribute to your total voting power as follows:

* 1 MANA contributes 1 VP
* 1 NAME contributes 100 VP
* 1 LAND parcel contributes 2000 VP
* The following Legacy Wearables Collections contribute 1 VP for each **uncommon**, 5 VP for each **rare**, 10 VP for each **epic**, 100 VP for each **legendary**, and 1000 VP for each **mythic**:
  * [Community Contest Collection](https://etherscan.io/address/0x32b7495895264ac9d0b12d32afd435453458b1c6)
  * [DCL Public Explorer Launch Collection](https://etherscan.io/address/0xd35147be6401dcb20811f2104c33de8e97ed6818)
  * [Exclusive Masks Collection](https://etherscan.io/address/0xc04528c14c8ffd84c7c1fb6719b4a89853035cdd)
  * [Halloween 2019 Collection](https://etherscan.io/address/0xc1f4b0eea2bd6690930e6c66efd3e197d620b9c2)
  * [My Crypto Heroes Collection](https://etherscan.io/address/0xf64dc33a192e056bb5f0e5049356a0498b502d50)
  * [Xmass 2019 Collection](https://etherscan.io/address/0xc3af02c0fd486c8e9da5788b915d6fff3f049866)
* Each Estate is worth 2000 multiplied by the number of single LAND parcels in that Estate. For example, an Estate with 2 parcels will contribute 4000 VP to your total voting power.

#### What happens if your voting power changes before a proposal closes?

If your MANA or LAND balance changes, it will affect your voting power, but only on proposals that are created after your balance changes.

The moment a new proposal is created, the DAO looks at all voters' MANA and LAND balances to calculate their voting power. In other words, when you vote on a proposal, the voting power of your vote will be equal to the balance you had at the instant the proposal was initially created. You may vote with that VP, then change your MANA/LAND balance without affecting the weight of your vote.

#### Why does the Decentraland DAO use weighted votes?

If the Decentraland DAO gave each Ethereum address one vote, and each vote was weighted equally, then users could create as many separate addresses as they wanted to obtain more voting power.

Determining voting power by considering the MANA, NAME and LAND balances is currently the most secure way to limit the amount of influence each voter may have. Additionally, the more MANA, NAME or LAND you own in Decentraland, the greater your personal stake is considered to be, thus earning your vote more influence within the DAO.

## Approve/Reject conditions

Depending on the type of proposal, a certain amount of participating VP is needed to consider the votation valid. You will see this referenced on the Governance dApp as the **Acceptance Threshold** for the proposal. Once the acceptance threshold has been met, a proposal is approved if the total voting power in favor of the proposal is greater than the total voting power against the proposal. This is the typical 50/50 majority model we expect to see in most democratic votes.

The only type of proposal that do not follow this rule are the **Pre-proposal polls**. Since these proposals are considered a non-binding mechanism to gather community feedback around an idea, they do not have predefined Yes/No options for voting. Users might add more that two options making them a multiple choice poll. It is important to mention that if the Pre-proposal polls reach the Acceptance Threshold defined of 500k VP, they might get promoted to a **Draft proposal** and end up being a binding **Governance proposal**.

## Browsing all proposals

To view all proposals in the DAO, visit [governance.decentraland.org](https://governance.decentraland.org). The homepage of the DAO lists all recently added proposals sorted from most recent to oldest, by default.

You can filter proposals by **Outcomes**:

* **Active** – proposals that are currently being voted on
* **Passed** – proposals that have been approved by the community
* **Rejected** – proposals that have already been voted on and either were rejected by the community or didn't met the acceptance threshold
* **Enacted** – proposals that have been enacted on-chain by the DAO Committee
* **Finished** – proposals that are closed, but do not have yes/no results, like multiple choice polls

You can also filter proposals by **Category** using the category column in the left side of the UI:

* **All proposals** – displays all proposals regardless of category or outcome
* **Catalyst Node** – only displays proposals to add new Catalyst nodes
* **Point of Interest** – only displays proposals to add new POIs
* **Name Ban** – only displays proposals to ban a name
* **Grant Request** – only displays grant requests
* **Pre-proposal Poll** – only displays non-binding polls
* **Draft proposal** – only displays draft proposals
* **Governance proposal** – only displays final binding governance proposals

To view only proposals that have been passed, click the **Enacted** tab. Enacted proposals in this tab are sorted from most recent to oldest by default.

## Viewing a proposal

To read a proposal, just click on the proposal's title to view the details page.

Each proposal detail page includes all of the descriptive information provided by the person who submitted the proposal.

You'll also find links to the proposal's discussion thread in the Forum, buttons to add a proposal to your watch list, the current voting results, buttons to vote, the acceptance threshold, your current Voting Power and who voted on the proposal.

Proposal details pages also list the unique avatar name associated with the Ethereum address that opened the proposal, if one exists, and the start and end dates of the proposal.

Finally, you'll see a link to the proposals entry on Snapshot – the voting platform used by the Decentraland DAO.

## Adding proposals to your watch list

To add a proposal to your watch list, view the proposal's detail page and click **Add to my Watchlist**.

To remove a proposal from your watchlist, click **Remove from my Watchlist** from the proposal's detail page. You can also click the red flag icon on any proposal currently in your watchlist to remove it.

## Participating in the Forum discussions

As a governance platform, the Decentraland DAO is most effective when paired with frequent discussion within the community. Every time a new proposal is opened on **governance.decentraland.org**, an accompanying topic is automatically opened on [**forum.decentraland.org**](https://forum.decentraland.org).

Before casting your vote, please take the time to view and join in on these forum discussions. Click the button **Discuss in the forum** from the details page of any DAO proposal you wish to discuss. You can also browse open topics by navigating to [forum.decentraland.org](https://forum.decentraland.org), heading to the **Governance** category, and browsing the open topics.

You don't need to own tokens to participate in these discussions! Everyone is welcome to contribute to the conversation.

## Voting

To vote on a proposal, log into the DAO at [governance.decentraland.org](https://governance.decentraland.org) with a wallet that contains MANA, NAME or LAND.

{% hint style="info" %}
**Minimum balance needed to vote:** Only MANA, NAME or LAND holders may vote on proposals in the Decentraland DAO. **The current minimum balance needed to have a weighted vote on proposals in the DAO is 1VP** Voting with a balance of zero will result in a vote with a weight of 0, which does not impact the final results.
{% endhint %}

To vote on a proposal once you've connected your wallet, simply view the proposal's detail page and click the **VOTE YES** or **VOTE NO** button, or select one of the multiple choice options if it is a poll, according to how you'd like to vote.

Make sure that you read the full proposal so that you understand the issue being discussed and what will happen if the proposal is approved or rejected.

After clicking the Vote button, your connected Ethereum wallet will prompt you to sign the transaction. Remember, this is only a signed transaction, and requires no gas fee.

You will be given the option of adding the proposal to your watch list, this is a nice way to track the proposals you're interested in. If you don't want to add the proposal to your Watchlist, just click **No thanks**.

After submitting your vote, you can change it at any time leading up to the end of the voting period - as shown in the proposal's detail page.

#### What happens if your VP changes before a proposal is complete?

The DAO calculates your voting power for each individual proposal at the moment each proposal is created. If your VP changes after this moment, it will not affect your vote on that proposal.

For a full discussion of voting power, and how and when it is calculated, please see the [Voting Power](#voting-power) section of the User Guide.

## Creating a proposal

To create a new proposal in the Decentraland DAO, start by logging in at [governance.decentraland.org](https://governance.decentraland.org) and connecting a wallet that contains MANA, NAME or LAND.

After logging in and connecting your wallet, click **Submit a proposal** and select the proposal category you want to use. Each category will provide a form allowing you to provide the relevant information for your proposal.

The form for every category is different, so make sure that you select the correct category for your proposal. The proposal forms in the DAO support Markdown, so you can format the content of your proposal to make it more readable. This is especially helpful for longer proposals.

To preview your rendered Markdown text, toggle the **Preview** switch. If you aren't familiar with Markdown, you can use simple plain text.

Some proposal categories have minimum VP submission thresholds, meaning you have to have at least certain amount of VP to submit the proposals. This will be informed to you on the Governance dApp.

After completing the proposal form for the category you've selected, click **Submit proposal**. After successfully submitting your proposal, you will be taken to your new proposal's detail page where you can add it to your watchlist and cast your vote.

## Proposal Categories

### Binding Proposals

#### 📍 Point of interest

Points of interest are notable locations in Decentraland. These "POIs" are promoted in several areas of the virtual world's UI, and are promoted as good places for users to explore, especially people new to Decentraland.

If you have created a location, or have found a location that you think should be on this list, or if you think a current POI should be removed since it's no longer interesting, you can use this proposal category to present your suggestion to the DAO.

#### 🚫 Name ban

The "banned name" list includes offensive or harmful avatar and location names that are not permitted in Decentraland. Any names on this list cannot be claimed, used, or transferred between users. To suggest banning a name, you can use the Name ban proposal category in the DAO.

#### 🌐 Catalyst nodes

Catalyst nodes are the community-run servers that provide the content and establish the peer-to-peer connections needed to keep Decentraland's virtual world running. Whenever a user opens Decentraland, they are connected to one of these nodes. However, only nodes that have been approved by the DAO are used in Decentraland's network.

To suggest the addition of a new node to the network, you can use the Catalyst Node category.

### Governance Process Proposals

Some proposals are not as simple as adding or removing an item from a list, they require community signaling, discussions and implementation paths. These proposals should be submitted thorugh a three-stage governance process that starts with a poll and ends with a binding proposal.

The voting process includes three steps: a Pre-Proposal Poll, a Draft Proposal, and a Governance Proposal. Each tier will have progressively increasing submission and passage thresholds to ensure important governance decisions are made by a representative majority (based on Voting Power). Each step must reach the defined VP threshold to be promoted to the next one.

#### 📊 Pre-proposal Poll

This is the first step to get to the final binding Governance proposal. Polls in the Decentraland DAO are non-binding, multiple choice questionnaires that may be used to measure the community's general opinion or sentiment regarding different issues. They are non-binding in that the DAO does not automatically act on the results of any of these polls. If a pre-proposal poll gathers enough participating VP (500k VP is the acceptance threshold) it might get promoted to Draft proposal.

#### 📊 Draft Proposal

A Draft Proposal presents a potential policy to the community in a structured format and formalizes the discussion about the proposal's potential impacts and implementation pathways. A Draft Proposal that fails or does not reach this threshold can be amended and resubmitted one time. If a Draft proposal gathers enough participating VP (1M VP is the acceptance threshold) it might get promoted to a binding Governance proposal.

#### 📊 Governance Proposal

This is the last step of the Governance process and is the only one that is binding. This proposal must flesh out all the details, data, methods, assesments or any other relevant information for implementing this proposal. A Governance proposal is accepted if it meets the acceptance threshold of 6M VP and the Yes option gets a simple majority.

## Deleting a proposal

Proposals can only be deleted by the person who created them.

To delete one of your proposals, navigate to the details page of the proposal you want to delete. Click **Delete Proposal** at the bottom of the right hand column. You will have to confirm your deletion.

Be careful! Deleted proposals cannot be restored!

If you delete a proposal after people have voted on it, nothing will happen. Deleted proposals with binding actions will not be enacted by the DAO Committee.


# Overview

The Decentraland DAO (Decentralized Autonomous Organization) is the governance body that manages and controls the Decentraland virtual world. It's composed of all MANA, LAND, and NAME token holders who can participate in the decision-making process.

This section provides a comprehensive overview of how the DAO operates, its capabilities, and how you can participate in governing Decentraland.

## Quick Links

* [What is the DAO](/dao/dao/what-is-the-dao) - Introduction to the Decentraland DAO
* [How does the DAO work](/dao/dao/how-does-the-dao-work) - Understanding the governance mechanisms
* [What can you do with the DAO](/dao/dao/what-can-you-do-with-the-dao) - Actions and capabilities
* [Participation Requirements](/dao/dao/what-do-you-need-to-participate) - How to get involved
* [The DAO Fund](/dao/dao/the-dao-fund) - Treasury and funding
* [DAO Limitations](/dao/dao/the-daos-limitations) - Understanding boundaries
* [The DAO Smart Contracts](/dao/dao/what-smart-contracts-does-the-dao-control) - Technical infrastructure


# What is the DAO

The DAO is the decision making platform for Decentraland.

The Decentraland DAO is the decision-making tool for MANA, NAMES and LAND holders in Decentraland's virtual world. Through votes in the DAO, the community can issue grants and make changes to the lists of banned names, POIs, and catalyst nodes. The DAO also controls the LAND and Estate smart contracts.

Issuing grants and making changes to the records and contracts owned by the DAO can only be done by using predefined proposals accessible in [governance.decentraland.org](https://governance.decentraland.org).

These proposals, the votes submitted, and final results are all stored in IPFS via Snapshot, a gas-less voting client. Approved proposals with binding actions are enacted on the Ethereum blockchain by a committee by means of a multi-sig wallet. This committee is overseen by the Security Advisory Board (SAB), another multisig with trusted key holders. This Committee was voted into place by the community in the previous release of the DAO. [The original proposal can be found here](https://forum.decentraland.org/t/proposal-for-a-more-accessible-and-affordable-dao/450).

The remainder of this document explains in greater detail what the DAO is, how it works, and what it can be used for.

For a detailed tutorial on how to use the Decentraland DAO, visit the [DAO User Guide](/dao/dao-userguide).

## The DAO is powered by smart contracts

All DAOs, or decentralized autonomous organizations, are part of a new approach to organizational management and decision making made possible by Ethereum.

Ethereum extended what's possible with blockchains by adding the ability to decentralize the handling of data more complex than just records of token ownership. Ethereum did this by allowing people to put smart contracts on a blockchain.

### What's a smart contract?

A smart contract is a computer program that is run on the Ethereum blockchain. It can store both functions (bits of code that do things) and data (information). Smart contracts are often compared to vending machines. If you put in specific inputs, you get specific outputs. If I walk up to a vending machine, insert $1, and press the "orange soda" button, then I'll get an orange soda if there's any left in the machine. If there's no more orange sodas, I'll get my dollar back.

Smart contracts work the same way, people can interact with them by sending information with the expectation of receiving specific results or information. Just like the vending machine doesn't have a little person inside handing out sodas, smart contracts are automatic (dare we say, autonomous).

If you'd like to learn more about Ethereum smart contracts, the [Ethereum documentation](https://ethereum.org/en/developers/docs/smart-contracts/) is the best place to dive in.

### The DAO controls Decentraland's critical smart contracts

The second important quality of smart contracts is their **ability to own other smart contracts**.

That's right, every smart contract has its own address (just like the address of your Ethereum wallet) that allows it to own other smart contracts and cryptocurrencies.

So, in slightly more technical terms, a DAO is one or more smart contracts that can perform specific, pre-defined tasks and maintain ownership of cryptocurrencies. DAOs are built in such a way that they will only perform their tasks under specific conditions, such as the passing of a proposal voted on by a group of people who own a certain token (like MANA, NAMES or LAND). All of this is done on a blockchain. Hence the name, "decentralized autonomous organization".

Decentraland's DAO also owns a sum of MANA and other tokens along with the LAND and Estate smart contracts. [This fund](https://governance.decentraland.org/transparency/) has been set aside to help sponsor community grants and to help grow the Decentraland platform according to the decisions and directions voted on by the community.

{% hint style="warning" %}
**📔 Note** The DAO does not own, and so cannot modify, the [MANA smart contract](https://etherscan.io/address/0x0f5d2fb29fb7d3cfee444a200298f468908cc942#readContract).

The MANA contract's owner is the [TokenSale contract](https://etherscan.io/address/0xa66d83716c7cfe425b44d0f7ef92de263468fb3d#readContract). The owner of the TokenSale contract is a separate contract that self-destructed on deployment ([as you can see on Etherscan here](https://etherscan.io/address/0xdf861993edbe95bafbfa7760838f8ebbd5afda9f)). This means that there is no other contract or wallet with the permissions to modify or pause the MANA supply.
{% endhint %}

There is other information that the DAO controls as well, such as the list of harmful or offensive names that are not permitted in Decentraland, a list of notable locations (POIs or Points of Interest) to be promoted to new users, and the list of community run servers that host Decentraland's virtual world.

Transferring any of the DAO's MANA, modifying the LAND or Estate smart contracts, or modifying any of the other listed information controlled by the DAO **can only be done** with the approval of MANA, NAMES and LAND holders.


# How does the DAO work

Overview of the different platforms and entities that make up the Decentraland DAO.

To circumvent the very high gas fees associated with full on-chain governance, Decentraland's DAO uses a combination of free, off-chain voting for the community and a multi-sig wallet controlled by a "DAO Committee" to enact those off-chain decisions on the Ethereum blockchain. This allows everyone who holds MANA, NAMES or LAND to participate in the DAO without having to pay any fees everytime they want to vote or open a proposal.

The use of a multi-sig wallet controlled by a committee of trusted persons guarantees the security of the DAO along with guaranteeing that passed proposals result in an on-chain action. A second multisig owned by the SAB provides a second layer of protection on top of the DAO Committee.

The DAO is a complex system created from several layers of entities and platforms, each of which is listed and described below:

## Governance dApp

The main interface for the Decentraland DAO is located at [governance.decentraland.org](https://governance.decentraland.org). This is where users log-in, create proposals, and vote.

*This is currently maintained by a development team funded by a* [*DAO grant*](https://governance.decentraland.org/proposal/?id=ed53e850-5e70-11ec-8188-4352ce3d30e7)*.*

## Snapshot

[Snapshot](https://snapshot.org/#/) is an off-chain voting platform that provides a free way for token holders to vote on proposals. By storing both the proposals and the votes on IPFS as cryptographically signed messages, Snapshot allows for secure and easily contested results.

Decentraland's DAO uses Snapshot to host the proposals and votes generated by the community.

Whenever a proposal is opened at governance.decentraland.org, it is also created automatically on [Decentraland's Snapshot space](https://snapshot.org/#/snapshot.dcl.eth). This allows the DAO to record and store proposals, votes, and results in a secure and decentralized manner - with the results displayed back on governance.decentraland.org. From the Snapshot space users can also [delegate their VP](https://snapshot.org/#/delegate/snapshot.dcl.eth) to other community members.

## Aragon

[Aragon](https://aragon.org/) is a secure platform for creating and managing the collection of smart contracts needed to run a DAO. The backend of Decentraland's DAO is built using Aragon, so anytime a proposal that results in a binding action is passed by the community in Snapshot, it is committed to the Ethereum mainnet in Aragon by the DAO Committee.

## DAO Committee

The DAO Committee is a group of three trusted individuals who have been selected by the community to hold keys in a multi-sig wallet. This multi-sig is responsible for enacting any passed votes with a binding action, like funding a Grant, banning a name, adding or removing a POI, implementing a Governance proposal or adding a Catalyst node.

The DAO Committee is overseen by the SAB, which has the ability to pause and cancel any action initiated by the Committee.

Every on-chain transaction initiated by the DAO Committee has an automatic 24-hour delay before it is completed, allowing the SAB or the Committee to revoke the transaction.

![DAO Committee](https://github.com/decentraland/documentation/blob/main/static/images/DAO%20Organizational%20Chart/DAO%20Committee.png?raw=true)

## Security Advisory Board (SAB)

The Security Advisory Board acts as a guarantor of Decentraland's smart contract security, and is tasked with overseeing the work of the DAO Committee and responding to vulnerability and bug reports in any of Decentraland's contracts.

The SAB includes 5 Solidity experts that have initially been selected by the Decentraland development team.

Any time a modification is to be made to the LAND or Estate contracts, the update must be unanimously supported by the SAB's multi-sig. At least three signatories are required with no dissenting votes in order to make any changes to the LAND or Estate contracts.

The SAB has the ability to pause, resume, or cancel any action taken by the DAO Committee.

Initiating the addition or removal of a member of the SAB can be done by kickstarting a Governance proposal process on [governance.decentraland.org](https://governance.decentraland.org).

![Security Advisory Board](https://github.com/decentraland/documentation/blob/main/static/images/DAO%20Organizational%20Chart/Security%20Advisory%20Board.png?raw=true)

## Wearables Curation Committee

The Curation Committee is responsible for reviewing and approving wearables and emotes submitted by the Decentraland community.

![Wearables Curation Committee](https://github.com/decentraland/documentation/blob/main/static/images/DAO%20Organizational%20Chart/Wearables%20Curation%20Last.png?raw=true)

## Revocations Committee

The Revocations Committee is responsible for reviewing cases raised by the community regarding Grants Program and has the responsibility to provide a resolution, which may be to revoke a vesting contract as a final action.

![Revocations Committee](https://github.com/lordlikedao/documentation/blob/main/static/images/DAO%20Organizational%20Chart/Revocation.png?raw=true)

## Governance Squad

Governance Squad is responsible for developing, enhancing and maintaining the technological infrastructure and decision-making tools of the DAO.

![Governance Squad](https://github.com/decentraland/documentation/blob/main/static/images/DAO%20Organizational%20Chart/Governance%20Squad.png?raw=true)

## Facilitation Squad

Facilitation Squad is responsible for managing communications and aligning different stakeholders, fostering collective decision-making and efficient governance operations.

![Facilitation Squad](https://github.com/decentraland/documentation/blob/main/static/images/DAO%20Organizational%20Chart/Facilitation%20last.png?raw=true)

## Grants Support Squad

Grants Support Squad has the responsibility of being in constant dialogue with the grantees community, to understand their needs and provide support to their blockers and requests.

![Grants Support Squad](https://github.com/decentraland/documentation/blob/main/static/images/DAO%20Organizational%20Chart/Grant%20Support.png?raw=true)

## The Forum

The [Decentraland Forum](https://forum.decentraland.org) is the communication hub for the DAO. Everytime a new proposal is created, an accompanying thread is opened automatically on the Forum under the [Governance section](https://forum.decentraland.org/c/governance/). These proposal topics can be found either by browsing the Forum, or by clicking the "Discuss in the Forum'' button on any proposal's detail page in the Governance UI. These threads are a space where voters can discuss the various impacts and issues that might result from a proposal.

## Discord Servers

The DAO operates on two Discord servers:

* [#dao channel](https://discord.com/channels/417796904760639509/538106198419832844) on the Decentraland Discord server for general announcements, discussions and questions.
* A [dedicated Discord server](https://dcl.gg/daodiscord) only for the DAO operations with more in-depth discussions, specific channels for working groups tacking complex issues and spaces for the community grant owners to post updates on their project. In this channel the DAO also host their monthly Town Hall.


# What can you do with the DAO

The DAO allows users to create and vote on proposals that shape the metaverse.

The DAO allows for two general types of proposals: **proposals with direct binding actions**, and **governance proposals**.

## Proposals with direct binding actions

The DAO allows the community to vote on **binding actions** that will result in changes made to Decentraland's smart contracts on the Ethereum network. Those binding actions are:

* Funding a community project by transferring a portion of the DAO's resources to a grant vesting contract.
* Adding a catalyst node to the network of servers that host and run Decentraland's virtual world.
* Adding or removing points of interest (POIs), or highlighted locations within the virtual world, to a list that is shown to users. This list helps users to find popular and interesting locations to explore.
* Banning a name from Decentraland. This proposal type allows users to ensure that avatars cannot be given offensive and harmful names.

## Governance proposals

Some proposals are not as simple as adding or removing an item from a list, they require community signaling, discussions and implementation paths. Those proposals should be submitted thorugh a three-stage governance process that starts with a poll and ends with a binding proposal.

The voting process includes three steps: a Pre-Proposal Poll, a Draft Proposal, and a Governance Proposal. Each tier will have progressively increasing submission and passage thresholds to ensure important governance decisions are made by a representative majority (based on Voting Power). Each step must reach the defined VP threshold to be promoted to the next one.

### Stage 1: Pre-Proposal Poll

* Submission Threshold: 100 VP
* Passage Threshold: 500K VP ( A poll that reaches at least 500K VP and does not garner a majority of participating voting power, may still advance to the Draft Proposal stage - ensuring all issues with enough support have an initial pathway toward passage into policy.)
* Voting Period: 5 Days
* Goal: Introduce a governance issue to the community, gauge community sentiment, and determine if there is enough support to move forward with drafting an initial proposal.

### Stage 2: Draft Proposal

* Submission Threshold: 1,000 VP
* Passage Threshold: 1M VP and simple majority (51%) of participating voting power (A Draft Proposal that fails or does not reach this threshold can be amended and resubmitted one time.)
* Voting Period: 1 Week
* Goal: Present a potential policy to the community in a structured format and formalize discussion about the proposal's potential impacts and implementation pathways. A Draft Proposal that fails or does not reach this threshold can be amended and resubmitted one time.

### Stage 3: Governance Proposal

* Submission Threshold: 2,500 VP
* Passage Threshold: 6M VP and simple majority of participating VP (or needed acceptance criteria for their category)
* Voting Period: 2 Weeks
* Goal: Formalize the passed version of a Draft Proposal into a binding Governance outcome.

It is important to notice that anyone who meet the submission threshold can take a passed proposal (either a Poll or a Draft) and move it to the next stage, not only the proposal author.

## What about modifying the LAND or Estate smart contracts?

Right now, the DAO owns both the LAND and Estate smart contracts. Any modifications to either of these contracts must be carried out by the Security Advisory Board (SAB) and DAO Committee – groups of trusted and elected persons tasked with ensuring the continued security of these important pieces of Decentraland's infrastructure.

The SAB must vote through a multi-sig wallet to approve any changes to the LAND or Estate contracts, preventing a rogue SAB member from introducing a vulnerability.

Currently, there are no predefined proposal categories for modifying the LAND or Estate smart contracts via the DAO's UI. That doesn't mean it is impossible for a non-SAB member to initiate changes, but it is a lengthier process that requires obtaining support from the broader community in addition to having the technical expertise needed to supply the code changes and a trusted third party to audit those changes.

The source code for the LAND and Estate contracts is available on GitHub [here](https://github.com/decentraland/land/tree/master/contracts).

Generally speaking, the process for modifying either contract would be:

* Polling the community via the DAO publishing a **pre-proposal poll**, and publicly discussing your proposed changes to gather support
* After gaining the initial community's support, publishing a **Draft proposal** detailing the changes and getting acceptance through a votation.
* Writing the updated code to be merged into the contract
* Obtaining a successful code review and audit from a reputable third-party
* Presenting the audited code to the community using a binding **Governance proposal** and obtaining their approval to have it merged with the contract
* Once approved by another community vote, the DAO Committee or SAB would perform the contract upgrade with the new code


# Participation Requirements

An explanation of what you need in order to create and vote in proposals in the DAO.

Broadly speaking, DAOs are organizations comprising token holders. In Decentraland's case, the tokens needed to be a member of the DAO are MANA, NAMES or LAND. By holding either MANA, NAMES or LAND, you may create and vote in proposals. Your vote on a proposal is weighted according to the balance of MANA, NAMES and LAND you have at the time that proposal was created. For more information, see the Voting Power section in the [DAO User Guide](/dao/dao-userguide).

Anyone is allowed and welcome to participate in discussions related to the DAO in [Discord](https://dcl.gg/daodiscord), the [Forum](https://forum.decentraland.org/), or any of Decentraland's other social channels, but only token holders can cast votes and create proposals.


# The DAO Fund

An overview and discussion of the DAO's MANA

The Decentraland DAO has been granted with a **10-year vesting contract worth 222,000,000 MANA** started on Feb 19, 2020.

You can view the DAO's vesting contract [here](https://vesting.decentraland.org/#/0x7a3abf8897f31b56f09c6f69d074a393a905c1ac). The MANA in this contract vests every second, thus gradually increasing the size of the DAO's fund.

The current state of the DAO treasury can be viewed on the [Transparency page](https://governance.decentraland.org/transparency/) of the [Governance dApp](https://governance.decentraland.org/).

The DAO also has other sources of income:

* A 2.5% transaction fee within the Decentraland Marketplacs on primary market commissions go to the DAO
* The OpenSea Marketplace also receives a 2.5% transaction fee for sales of LAND, Estates, Names, and wearables, [part of which is transferred to the DAO](https://etherscan.io/token/0x0f5d2fb29fb7d3cfee444a200298f468908cc942?a=0x9b814233894cd227f561b78cc65891aa55c62ad2).


# DAO Limitations

The DAO is a specific governance tool with a finite amount of power.

The most important thing to remember about the Decentraland DAO is that it is a specific governance tool with limited capabilities. Like a vending machine, the DAO is mostly automated. However, this automation leads to limited options.

There is a finite number of functions within the DAO's smart contracts. These functions can easily be called by passing one of the binding proposals in the Governance dApp, but the process for adding or modifying functions or Governance mechanisms within the DAO is much more complex. For that, DAO members can embark on the path of getting through the Governance proposal process by going from a pre-proposal poll to a binding Governance proposal (Read more [here](/dao/dao/what-can-you-do-with-the-dao))

Making changes to how this kind of organization runs, takes time and social momentum. This can only be built up through fostering productive relationships and dialogue with the broader Decentraland community by taking advantage of all the social interaction spaces available (The [forum](https://forum.decentraland.org/), [Discord](https://dcl.gg/daodiscord), Twitter, the [Governance dApp](https://governance.decentraland.org/) and any others).


# The DAO Smart Contracts

The DAO owns and controls Decentraland's most critical smart contracts.

The Decentraland DAO owns several of the most critical smart contracts of the Decentraland platform. They are listed below:

## ⛰️ The LAND contract

This is the contract that manages the LAND tokens. The DAO is the owner of the LAND smart contract. This means that any changes or modifications to that contract must be carried out by the DAO and the SAB.

## 🏘️ The Estate contract

Like the LAND contract, the DAO owns the Estate contract which can only be modified by the SAB, after approval has been given by the DAO through a community vote.

## 📍 POIs

The list of Points of Interest (notable locations in Decentraland that are advertised to users as good places to begin exploring the virtual world) is also owned by the DAO. This list is stored on a contract and can only be modified after passing a vote by the community that is then enacted on-chain by the DAO Committee.

## 🏷️ Names

The contracts used to mint the NFTs for unique avatar names in Decentraland are owned and controlled by the DAO. Any changes to the names contract must be approved by the DAO.

## 🚫 Banned names

The list of names that have been banned from the Decentraland client is stored in a contract owned by the DAO. This list can only be modified after passing a vote by the community that is then enacted on-chain by the DAO Committee.

## 🌐 Catalyst nodes

The list of Catalyst nodes that serve content and establish the peer-to-peer connections needed to keep Decentraland's virtual world running is also owned and controlled by the DAO. This list is stored on a contract and can only be modified after passing a vote by the community that is then enacted on-chain by the DAO Committee.

## 👕 Wearables collections

In Decentraland wearables can be grouped into collections before minting. The contracts used to manage wearables collections are owned and controlled by the DAO.

## 🛒 Marketplace contracts

The Decentraland Marketplace dApp makes use of several smart contracts to manage the process of selling and bidding on LAND, Estates, and other NFTs. These contracts are also where the marketplace fees are defined, and can only be changed with the DAOs approval.

## 💰 Grants

The vesting contracts used to make recurring payments as part of the DAO's Grant framework are also owned by the DAO. These contracts are created by the DAO Committee on behalf of the DAO, and are overseen by the SAB to prevent any risk of monetary loss due to vulnerabilities or mistakes made by the Committee. Status of any vesting contract can be checked using [this tool](https://vesting.decentraland.org/)


# Welcome Creator

Let's build Decentraland together!

All creators are welcome! In Decentraland you have a wide range of Creative possibilities, for people of different talents and skill levels!

Decentraland is available on desktop (Windows and macOS) and on mobile devices (iOS and Android). Players move seamlessly between clients with the same account, avatar, and inventory — which means your scenes need to work well for everyone, regardless of the device they're playing on. Throughout this guide you'll find recommendations on how to design, build, and test your scenes so they work great on every supported platform. For mobile-specific guidance, see [Building for Mobile](https://github.com/decentraland/docs/tree/main/creator/sdk7/building-for-mobile/README.md).

## The Creator Hub

The Creator Hub is the recommended tool for creators of all knowledge levels. It's a desktop application that lets you create:

* [Wearables & Smart Wearables](#wearables)
* [Emotes](#emotes)
* [Scenes](#scenes)

![](/files/V8zO6yiKuXQbnyHH1rVq)

Download the Creator Hub [here](https://decentraland.org/download/creator-hub).

## Wearables

Wearables are items of clothing that player avatars can wear. These are sold as NFTs and purchased in the [Marketplace](https://decentraland.org/marketplace/browse?section=wearables\&vendor=decentraland\&page=1\&sortBy=newest\&status=on_sale).

Learn everything about [Creating wearables](/creator/wearables-and-emotes/wearables/creating-wearables).

You can also combine a wearable with code from the SDK to create a [smart wearable](/creator/scenes-sdk7/kinds-of-projects/smart-wearables). This turns on a global scene whenever the player puts on the wearable. See [Kinds of project](/creator/scenes-sdk7/kinds-of-projects/kinds-of-project) to better understand the different options.

## Emotes

Emotes are animations that a player's avatar can do. These are sold as NFTs and purchased in the [Marketplace](https://decentraland.org/marketplace/browse?assetType=item\&section=emotes\&vendor=decentraland\&page=1\&sortBy=newest\&status=on_sale).

Learn everything about [Creating emotes](/creator/wearables-and-emotes/emotes/creating-emotes).

## Scenes

3D content in Decentraland is made up of scenes, each scene occupies a finite amount of space and is displayed one next to the other for players to freely walk through them.

The Creator Hub lets you create scenes with an easy drag-and-drop interface, and also edit code to have full control over the interactions. You can run previews, debug, edit code, and publish.

[Learn more](/creator/scene-editor/get-started/about-editor)

### 3D Art

Decentraland scenes are made up of 3D models.

* Chose from the wide catalog of default assets in the Scene Editor. These are ready to go and optimized for using in Decentraland

  ![](/files/qoVdii2KSgmQDHjQdw8D)
* Craft your own 3D models using Blender or your preferred 3D tools. Then import them into the Scene Editor.

  ![](/files/pGV5ygBn1CDpcoH84CBz)

{% hint style="warning" %}
**📔 Note**: Content in Decentraland should stay within certain [size limitations](/creator/scenes-sdk7/optimizing/scene-limitations) to ensure your scene runs smoothly.

See [3D modeling](/creator/3d-modeling-and-animations/3d-models) for tips and tricks for optimizing, and information about supported features and formats for 3D models.
{% endhint %}

### Interactivity

To make your scene interactive:

* **No Code**: Use the UI of the Scene Editor to drop [Smart Items](/creator/scene-editor/interactivity/smart-items) into your scene. These are models that come pre-built with their own behavior, and are highly customizable. You can also assign the same behaviors to your own custom models (no code required).

  ![](/files/V20PKyr0qisUHnwoyYjY)
* **Code**: For developers that want to incorporate custom logic, use the SDK to write code and do anything you can imagine. Learn to use the SDK:
  * [SDK Quick start](/creator/scenes-sdk7/getting-started/sdk-101): follow this mini tutorial for a quick crash course.
  * [Development workflow](/creator/scenes-sdk7/getting-started/dev-workflow): read this to understand scene creation from end to end.
  * [Vibe Coding with AI](/creator/scenes-sdk7/getting-started/vibe-coding): build scenes by describing what you want in plain language, and let an AI coding assistant write the code for you.
  * [Examples](https://studios.decentraland.org/resources?sdk_version=SDK7): dive right into working example scenes.

    ![](/files/aBj8dZSdpgNH1pNFe7Nt)

{% hint style="warning" %}
**📔 Note**: You will also need to have [Visual Studio Code](https://code.visualstudio.com/) installed.
{% endhint %}

### Publishing scenes

You don't need to own any tokens to start building your scene with the Scene Editor. To publish your scene, you can chose from the following options:

* **LAND in Genesis City**: This is the main open world in Decentraland, which is split up in 16x16 meter parcels. Buy one or several adjacent parcels in the [Marketplace](https://decentraland.org/marketplace/lands), and deploy your scene there.
* **Decentraland Worlds**: [Worlds](/creator/scenes-sdk7/publishing/publishing-options#decentraland-worlds) are your own spaces in the metaverse. All you need is to own a [Decentraland name](https://decentraland.org/marketplace/names/claim), and you can publish a scene as big as you want!

See [Kinds of project](/creator/scenes-sdk7/kinds-of-projects/kinds-of-project) to better understand the different options.

See [publishing](/creator/scenes-sdk7/publishing/publishing) for details and special options when publishing a scene, to either Genesis City or Worlds.

## Useful Resources

Check out [Useful Resources](/creator/scenes-sdk7/getting-started/useful-resources) for a curated list of tools, add-ons, asset libraries, and example projects that can speed up your creation workflow.


# Example Scenes

Decentraland Studios provides a comprehensive library of free, open-source example scenes and templates to help you learn and kickstart your projects. These resources are maintained by the community and showcase various SDK features and best practices.

## What You'll Find

On the [SDK 7 example scenes](https://studios.decentraland.org/resources) page, you can explore:

* **Ready-to-use Templates**: Download complete scene templates that you can use as starting points for your own projects
* **Feature Demonstrations**: See how specific SDK features work in practice, from basic interactions to advanced mechanics
* **Game Mechanics**: Examples of common game patterns like quests, collectibles, multiplayer interactions, and scoring systems
* **Interactive Elements**: Learn how to implement buttons, doors, NPCs, UI elements, and other interactive components
* **Media Integration**: Examples showing how to add video players, audio, and streaming content to your scenes
* **Blockchain Features**: Scenes demonstrating wearable interactions, token gating, and other Web3 integrations

Each example comes with full source code that you can download, study, and modify for your own scenes. They're an excellent way to learn SDK 7 patterns and accelerate your development.

You can find more working examples of specific SDK features, along with tools and asset libraries to speed up your workflow, in [Useful Resources](/creator/scenes-sdk7/getting-started/useful-resources).

{% hint style="info" %}
**💡 Tip**: Browse the examples before starting a new project - you might find a template that's close to what you want to build, saving you significant development time.
{% endhint %}


# SDK & Editor Videos

Video tutorials for Decentraland SDK and Scene Editor

Comprehensive video tutorials covering Decentraland's SDK and Scene Editor. These videos will guide you through creating scenes, adding interactivity, and deploying your content.

## Watch the Full Playlist

{% embed url="<https://www.youtube.com/playlist?list=PLAcRraQmr_GP_K8WN7csnKnImK4R2TgMA>" %}
SDK & Editor Video Tutorials Playlist
{% endembed %}

## Topics Covered

The video series includes tutorials on:

* **Getting Started** - Setting up your development environment
* **Scene Editor Basics** - Using the Scene Editor interface
* **SDK Development** - Building scenes with code
* **3D Essentials** - Working with 3D models and animations
* **Interactivity** - Adding button events and triggers
* **Publishing** - Deploying your scenes to Decentraland

## Additional Resources

* [SDK Quick Start](/creator/scenes-sdk7/getting-started/sdk-101)
* [Scene Editor Essentials](/creator/scene-editor/get-started/scene-editor-essentials)
* [Code Examples](/creator/tutorials-and-examples/examples)


# Emote Videos

Video tutorials for creating emotes in Decentraland

Step-by-step video tutorials for creating custom emotes in Decentraland. Learn how to animate, rig, and publish emotes for avatars.

## Watch the Full Playlist

{% embed url="<https://www.youtube.com/playlist?list=PLAcRraQmr_GN8LcnnQk2BByo9L2Orvp9c>" %}
Emote Creation Video Tutorials Playlist
{% endembed %}

## Topics Covered

The video series includes tutorials on:

* **Avatar Rigging** - Understanding the Decentraland avatar rig
* **Animation Basics** - Creating emote animations
* **Blender Workflow** - Using Blender to create emotes
* **Particles & Effects** - Adding visual effects to emotes
* **Props & Sounds** - Including props and audio in emotes
* **Publishing** - Uploading emotes to the Builder

## Additional Resources

* [Emotes Overview](https://github.com/decentraland/docs/blob/main/creator/wearables-and-emotes/emotes/README.md)
* [Creating Emotes](/creator/wearables-and-emotes/emotes/creating-emotes)
* [Avatar Rig](/creator/wearables-and-emotes/emotes/avatar-rig)
* [Uploading Emotes](/creator/wearables-and-emotes/manage-collections/uploading-emotes)


# Wearable Tutorial Series

This 6 part tutorial series will teach you how to create and publish a Wearable from start to finish without prior knowledge of Blender or Decentraland with professional artist KJ Walker as your guide

This series of tutorials will guide you through the complete process of creating and publishing a wearable, from start to finish. The tool you will be using is Blender, and no prior experience is required.

{% hint style="info" %}
**💡 Tip**: Install the [Decentraland Tools Blender plugin](https://extensions.blender.org/add-ons/decentraland-tools/). It includes several handy functions to help you edit and export 3D models, wearables, and emotes.
{% endhint %}

KJ Walker will take you on this adventure, going from Blender Essentials to advanced concepts in an interactive yet profound way. You can find more information about her and Low Poly Models [here](https://www.lowpolymodelsworld.com/)

The series are divided into 6 different Parts. This page will continue to be updated as each part of the series is uploaded.

## Index

* [Part 1: Making your first Hat](#part-1)
* [Part 2: Creating a Hat from Scratch](#part-2)

## Part 1: Making your first Hat

{% embed url="<https://www.youtube.com/watch?v=6Q8FNyjFTxc>" %}

In this first video, we’ll start from square one. You’ll learn what Blender is, how to download it, and how to confidently navigate the interface using a provided project file. By the end of this lesson, you’ll be comfortable moving around Blender and making simple edits to your first 3D object.

Key concepts featured in this video:

* Navigate the Blender interface
* Move, scale, and rotate objects
* Apply simple materials and change colors
* Export and import files

### Blender files you'll Need

* [Download Blender and GLB files (Wearable Hat ZIP)](https://github.com/decentraland/docs/raw/refs/heads/main/resources/BlenderForBeginnersPart1.zip)

<img src="/files/eKmHCwBEJeYqiO89H2nW" alt="" width="240">

&#x20;

<img src="/files/AHDFAPGxnOS7lSUFNQ1o" alt="" width="240">

## Part 2: Creating a Hat from Scratch

{% embed url="<https://www.youtube.com/watch?v=qG0mtikJodg>" %}

In this video, you’ll start building a hat from scratch using basic shapes. We’ll cover essential Blender modeling techniques like adding loop cuts, dissolving edges, using proportional editing, and refining geometry. You’ll also learn how to create and apply materials to shape the look and style of your hat.

By the end of this lesson, you’ll feel more confident shaping 3D objects in Blender and refining them with both geometry and materials, no prior 3D experience required.

Key concepts covered in this video:

* Shaping a hat from scratch using basic geometry
* Adding loops and refining forms
* Dissolving edges for cleaner topology
* Using proportional editing
* Creating, adding, and editing materials
* Applying textures and optimizing for performance

### Blender files you'll Need

* [Download Blender and GLB files (Wearable Hat Number 2 ZIP)](https://github.com/decentraland/docs/raw/refs/heads/main/resources/BlenderForBeginnersPart2.zip)

<img src="/files/cKuimLAbiC8PJhokyHun" alt="" width="240">

&#x20;

<img src="/files/dPhDEeRD9Syzgr2CXRtL" alt="" width="240">


# Wearables

An overview of wearables NFTs for Decentraland


# Creating Wearables

Tips And Guidelines For Creating Decentraland Wearables

![](/files/zGt8ZtBJxcQxnu6yJbWv)

## Intro

This guide introduces the basics for creating custom 3D models for Decentraland wearables. It explains how the Decentraland avatar system works, and it illustrates how to properly model your own wearables.

*Note: this guide assumes that you already have some basic to intermediate knowledge of 3D modeling. If you’re new to 3D modeling,* [*start here*](https://docs.decentraland.org/creator/3d-modeling/3d-models/)*.*

{% hint style="info" %}
**💡 Tip**: Install the [Decentraland Tools Blender plugin](https://extensions.blender.org/add-ons/decentraland-tools/). It includes several handy functions to help you edit and export 3D models, wearables, and emotes.
{% endhint %}

Before you get started, download the example files for reference meshes and textures: [**Wearables Reference Models**](https://drive.google.com/drive/u/1/folders/12hOVgZsLriBuutoqGkIYEByJF8bA-rAU)

## The Decentraland Avatar System

The Decentraland "avatar system" is the broad collection of different body components and subcomponents that can be decorated with custom wearables. These components are:

* Body shape
* Head
  * Head shape
  * Eyebrows
  * Eyes
  * Mouth
* Upper body
* Lower body
* Handwear
* Feet
* Accessories

### **Base Body Shape**

After downloading the base avatar example file, load the model into your 3D editor, like Blender.

You’ll notice that each model contains 8 different meshes related to an armature. These meshes represent the head, eyebrows, eyes, mouth, upper body, lower body, hands and feet. You can use these example models as a reference and starting point for your own custom wearable.

Currently, there are two body shapes: A or B.

![](/files/xFPYXklDmWMtVQvtPuSL)

### **Head**

![](/files/aCIgq0TVdddet3iHMfiM)

*The base head includes different meshes attached that can be customizables as wearables: Eyebrows, Eyes and Mouth work as transparency masks rendered in front of the face.*

### **Upper Body**

![](/files/hlSnFYRkISeFSfk6q22Y)

*The upper body, or torso, of an avatar. Does not includes the hands.*

### **Lower Body**

![](/files/rN58sGv958hCd7jikPuB)

*The lower body includes the pelvis and legs of an avatar.*

### **Hands**

![](/files/RGJf1oMzruqQfn1qL8qa)

*The hands are the same for Shape A and B, and start on the wrists of an avatar.*

### **Feet**

![](/files/5nsVWGBu40x3F0o15yxA)

*Feet include ankles and foot.*

{% hint style="warning" %}
**Important: Do not modify the vertices "cuts/stitches" between the head, upper and lower body.**
{% endhint %}

Each part of the body has caps, making them "water tight". These caps exist to prevent unsightly glitches if there are any animation clipping problems due to bad skin weighting. It’s best to not remove these caps when editing the mesh.

![](/files/tLw2tuocyocvU6z1VjW6)

## Building 3D Models for Wearables

#### **Tris, materials and texture limitations**

To ensure that Decentraland runs smoothly for all players, it is important to create wearable models without using too many triangles, materials and textures. The goal is to keep the 3D models as simple as possible so they can be easily rendered, without sacrificing too much detail.

There are limits for the number of triangles and textures that can be used for each wearable or accessory:

* No more than 1.5K triangles per wearable slot: hat, helmet, upper body, lower body, feet and hair.
* No more than 500 triangles per categories: mask, eyewear, earring, tiara, top\_head and facial hair.
* For hand accessories, the budget is 1k tris. If the hand wear hides the base hand of the avatar, the budget is 1.5k tris.
* No more than 2 textures (at a resolution of 512x512px or lower) per wearable. All textures must be square at 72 pixel/inch resolution.
* No more than 2 materials (without counting the AvatarSkin\_MAT)
* In the case of skin wearable, the amount of tris allowed are 5k and 5 textures.

{% hint style="warning" %}
**Wearable Tris Combiner:**

*If the wearable hide other wearables the creator is allowed to combine the tris per slot. For example: if you want to do a jumpsuit you could create it using the upper body category hiding lower body; in that case you could have 1.5K*2= 3K triangles.\*

In the case of the helmet, if you hide all the head wearables (head, earrings, eyewear, tiara, hat, facial\_hair, hair and top\_head you can reach the 4k tris, 2 materials and 2 textures)
{% endhint %}

#### Max Width, Height and Depth Dimension of the Wearables

There is a distance limit for wearables to ensure that they do not obstruct the visibility of other players screens or invading the scene space in an excessive way.

The dimension for the wearables cannot exceed:

> `Height: 2.42 m`, `Width: 2,42 m`, `Depth: 1,4 m`

![](/files/H43SO9kJjkzqUrN0nS8h) ![](/files/FDJsiKErPWctFpLSBFhy)

#### **Maps**

Decentraland wearables currently supports 3 types of maps, which are:

1. **Base Color**: This is the main texture with the colors and details of your model.
2. **Emission**: This map is for the parts that are glowing in your model. The emission map goes in a separated material specifically for emission.
3. **Alpha**: This map is to handle transparency. It uses the opacity channel of the texture. (*It is always preferable to use Alpha Clip rather than Alpha Blend, using a black and white texture for the cutout*)

![](/files/1P14NSIUnC7kCzf8Ots7)

Because Decentraland reference client uses of a Toon Shader for the avatar materials, some maps are **not necessary** like:

* **Normal maps:** textures used to simulate high-resolution details on low-polygon models by encoding surface normals as RGB values.
* **Roughness maps:** textures used to define the surface roughness of 3D objects.

To use these maps in Decentraland the workaround is to bake them in one texture. You can find more info about baking textures here: <https://docs.blender.org/manual/en/latest/render/cycles/baking.html>

#### **Normals**

**Decentraland engine render only one side normals.** (That means that a plane only will be visible from one side, the other side won’t be rendered) So, to ensure that your 3D is absolutely correct with the normals we can check that in two different ways.

The first one is to toggle the "Backface culling" on the Material properties settings, this is a good practice for spot inverted normals, like in this image:

![](/files/zxh16ZCEh7rMZD4SktwG) ![](/files/rYgG6Esao1SxAGY6sYR3)

The second way to check if the normals are right is by toggling "Face orientation" on the viewport overlay options. It will turn your model blue, but don’t worry. The blue faces are the correct ones and the red ones are the ones that needs to be corrected, you can find this option here:

![](/files/jZhhLD7B0fkBSDiJKEpj)

#### **Armature**

Remember not to change any of the specifications, naming conventions, hierarchy, or transforms of the given armature. Changing any of these will cause the wearable to stop working in the client after exporting.

![](/files/PDUy8RxYYtAUiPiYUNfX)

Be sure that the armature imported has no any *end* or *neutral* bones, otherwise the wearable is not going to work after exporting to the builder. If you are importing an .fbx that has this issue you can toggle ***Ignore Leaf Bones*** when importing the armature.

![](/files/E7CWTryIxmgm2zXA2Lkp)

{% hint style="info" %}
**Spring Bones:** Wearables can include extra bones beyond the base armature for dynamic physics (e.g., swaying hair, dangling earrings). These bones must contain `springbone` in their name. See [Spring Bones](https://docs.decentraland.org/creator/wearables-and-emotes/wearables/spring-bones) for full details.
{% endhint %}

#### **Eyebrows, Eyes and Mouth**

These meshes work with a transparent shader so you don’t have to do anything aside from creating your own png texture for the new eyebrow, eye, or mouth style you want and placing it correctly into the UV map. These textures should be 256x256px and need to have an alpha channel for transparency.

Here are some example png textures:

![](/files/meCukRPhfy55OxDD2K0h) ![](/files/54eAztHBZexiSheg02Zy) ![](/files/aVfZJfchOKFZMa7ImVDo)

*Eyes and Eyewbrows use the same mesh and UV map.*

![](/files/srfIl73VHATf3CwrIADU) ![](/files/R67WIar1KBBouqDelMVi)

*Mouth mesh and UV map.*

To visualize the final result you’ll need to use these nodes (in Blender):

![](/files/G8UZCEuUhIZEBFa7Ardo) ![](/files/khOVjVGhIpnYK8dhv6tY)

**Masks:** The Avatar Editor has different color options that players can choose from to customize their avatars.

![](/files/EECwsdKHcjtxywTxZMU3)

These color choices are applied to a specific mask in the wearable.

![](/files/GUcO99BpR7gNjlfGfzgb) ![](/files/AcbstDFr9zeILyExjVKp)

The black area in the image on the left (Eyes Mask) indicates the area of the texture on the right (Eyes Base) that will be colored. It’s important to remember that irises always need to have a grey scale (if the iris is pure black, the tint isn’t going to work. By the contrary, if the iris is pure white it would be fully tinted by the selected color using the editor).

#### **Handwear**

There are two types of **Handwear** you can do under the same category.

1. **Replacing Hands:**

![](/files/Z7dU1dLWzBdalKAML5pr)

If you want to create handwear that replaces both hands you would probably need to override the ***hand*** base mesh. Doing that, the limit for the handwear wearable would be 1500 tris.

2. **Hand Accessories:**

![](/files/2IbRJYVGYeHMZVnxZIbQ)

Also you can create hand accessories like watches, bracelets, rings, etc. In that sense, the hand doesn't need to be overridden and the limit is 1000 tris per item.

{% hint style="warning" %}
Note: The **handwear** category is specifically for hand accessories or replacing hands that follow the avatar armature with proper skinning. It is not meant for items such as swords, shields, or any similar asset. Submitting an item that doesn't follow these specifications may result in rejection by the curators committee.
{% endhint %}

#### **Hair and Facial Hair**

{% hint style="success" %}
**Tip:** Hair and other hanging accessories can now use **spring bones** to move dynamically in response to avatar movement and gravity. Instead of static hair, you can add spring bone chains to make ponytails, braids, and long hair sway naturally. See [Spring Bones](https://docs.decentraland.org/creator/wearables-and-emotes/wearables/spring-bones) for a complete guide.
{% endhint %}

There are two important things to remember when creating custom hair wearables.

First, try to follow the shape of the head. You can always refer to the head mesh provided in the example files if you need a place to start.

![](/files/8VXvVBriB9IwSpJPfM0X)

Second, if you want users to be able to change the color of the hair or facial hair using the avatar editor, then you need to paint the hair in grayscale and use "Hair" in the naming of the material (example "M\_Hair\_Short"). If you want to include other object which doesn't is influenced by tint just don't add that naming convention.

![](/files/509n8OpolZzOXVi1EI04) ![](/files/Fw3z94VXRwhWYnOAEZpS) ![](/files/NkwcxpYtj6WzfFHDYv7Z)

*Lower tones of gray will appear darker and higher tones of gray will appear brighter, multiplied by the color selected from the user in the avatar editor.*

### **Base Materials and Textures**

There are three basic materials for avatar models. One is the material used for the wearable itself, another one is used for the skin and another one for the eyebrows, eyes and mouth.

![](/files/Lf3xvnSqj8wITnMtDoxP)

Each base mesh comes with its own skin texture.

![](/files/VmgFaCKJxBoah4u4TaZF) ![](/files/zzChQ38CgzL05xzs1umT)

The skin texture is made in grayscale so it allows the render engine to tint the skin of the avatar using the editor according to the user’s preference. In order to be able to tint the skin color using the editor the name of the material must be *AvatarSkin\_MAT*.

![](/files/apbeKFJBOyfioCu1bKPh)

{% hint style="warning" %}
Important: always preserve the UV mapping for any body part that is exposed by a wearable, like the legs exposed by the shorts or skirts.
{% endhint %}

\src="../images/wearables-and-emotes/creating-wearables/19\_skin\_uv.png"width="600"/>

You can create custom textures for your wearables! However, it’s always best to use a single, very small, texture file for each wearable. Using the default AvatarWearable\_MAT texture provided in the example files will guarantee that your wearables are performant!

![](/files/HLCQPn6VcYsYVycrROnF)

{% hint style="warning" %}
To prevent triggering facial feature-specific shaders, do not include '\_mouth,' '\_eyebrows,' or '\_eyes' in the naming of any meshes. These terms are reserved for facial features, and using them inappropriately will apply the wrong shader to the mesh.
{% endhint %}

✨ In the case you want to do your own textures for the model we recommend the following addons for better UV Unwrapping:

**UVPacker**

UvPacker is a free addon that helps you to pack and organize your uvs with just a few clicks. As Decentraland works with 512x for the wearables this tool is a great assist to create better and more organized textures.

You can download directly from the website here:

[**https://www.uv-packer.com/download/**](https://www.uv-packer.com/download/)

**UVToolKit**

UvToolKit is a addon that helps you to expand your UV settings and options to create great UVs in blender.

Here is the link for the download: [**https://alexbel.gumroad.com/l/NbMya**](https://alexbel.gumroad.com/l/NbMya)

### **Skin Weighting**

Skin weighting is the process of determining which bones in the avatar’s rigging affect which wearables during an animation.

When skin weighting our new wearables, there are several considerations we need to keep in mind.

Each asset must be weighted to the full skeleton. For example, an upper body asset will look like this when applying skin weights:

![](/files/zPjkDypdfk0r7tGUuoGj)

Wearables that meet at intersections between body parts must be fully weighted to the same bone. For example, in these two green zones, the vertices in the neck need to be fully weighted to the "Neck" bone only.

![](/files/VdDEEwKENqehK9V2je34)

#### **Key Bones**

The "key" bones to use when skin weighting are:

**Head Bone:** for the hair, earrings, tiaras, eyes, eyebrows, mouth and any accessory that needs to follow the head’s movement.

**Neck Bone:** for the main head and upper body’s intersecting vertices.

**Hips Bone:** for the upper body and lower body’s intersecting vertices.

**Right Leg and Left Leg Bones:** for the lower body and feet intersecting vertices.

**Right Forearm and Left Forearm** for the hands intersecting vertices.

{% hint style="warning" %}
⚠️ **Hint**

* Remember, you can use any bone to influence any mesh’s vertices! For example, you could create a new foot mesh for a tall pair of boots, and skin weight the top of the boot to the "Leg Bones". Or, you could create some long hair and use the "Shoulder" or "Spine" bones to influence the hair when the avatar moves around.
* It's always recommendable to keep a symmetry from both sides of the rig, left and right should have similar bone influences.
* As a common advice, a vertex cannot be influenced by more than 4 bones or joints.
* Keep in mind to export the armature exactly as the one provided in the documentation. If it has any other bones like *"\_end\_bones"* or similar is not going to work on the client.
  {% endhint %}

#### **Exporting Wearables**

When exporting wearables, make sure there are no other bones outside of the given Armature, **except for spring bones** (bones with `springbone` in their name, used for dynamic physics). A common problem when importing armatures between different software is the appearance of *"\_end"* or *"\_neutral"* bones. Be sure to remove those before exporting. Otherwise, it is very likely that the wearables will not work on the client afterwards.

![](/files/8ivyid3CTTmoqyUGNtRX)

To export the wearable, select the object and then the armature. Be sure to not export anything else, such as cameras, lights, or empty objects.

Next, export the wearable in *glTF2.0* format. Make sure you only export the wearable with its skinning properties, and without any other unnecessary features like animation or shape keys.

![](/files/su8RXyYQNfETidzxwCRI)

## Good Practices For Modeling

### **Change Your Mesh From T-Pose To A-Pose**

When you’re making wearables, the best way to visualize the final result, and to facilitate how you handle topology and position of the wearable is to work with the model in A-Pose. In order to do that you have to follow this simple steps:

1. First select the upper body, then you have to toggle "**Edit mode**" and "**On cage**" in the armature modifier.

![](/files/CeXWmx7bqXSOCrCtKfiX)

2. Now, in pose mode you can rotate the arms 60°.

![](/files/KEGim8n0Z1PucimvHp5a)

3. You can edit your mesh in A-Pose instead of T-pose.

![](/files/8XCy0tFPigXI2PlmiqrQ)

4. But it is also good to keep in mind that you can easily alternate from A-Pose to T-Pose just toggling back the "Edit mode" and "On cage" in the armature modifier.

![](/files/thiUklXbyAc1VHckVJAh)

### **Joint deformation:**

In order to get the best results on the wearable topology when it comes to joints (arms or legs, for example) it's important to have good practices when creating loops. Here we can see the difference on the deformation of the mesh for different loop cuts:

![](/files/d9J22SzFEBAldTGFwBgg)

A good way to ensure that everything is deforming correctly is to do a weight paint like the following example:

![](/files/8kHlhw5NmHeJf64oepvU) ![](/files/BfnBidXRZM9pREYfdHho)

### **Skirts**

A useful tip and good practice when modeling skirts/dresses is to add additional loopcuts in the intersections of the folds. This will be very handy when you have to paint the weights of the rig.

![](/files/Ut0OZMr3oqUPDqnriefh)

With this loopcuts the vertex influence look a lot more smooth and give you better results when you’re animating a skirt/dress.

Here is an example of how the bone influence should be:

![](/files/UxdaUkhycAId3KkExkxt)

### **Hats**

A good practice when creating hats is to add a hair to the base mesh of the hat and then hide the category *hair* using the editor. Doing this is going to prevent that the hat clips with other hairs and reduce unexpected results.

![](/files/myIWRY3pQPg3FD5aHBmT)

### **Add Polygon Count**

A valuable tip is to always keep on track of the polycount of your models. To do that in blender you need to turn on statistics on the viewport overlays panel.

![](/files/iiq2PeqjrVFJl1sIvZAQ)

### Resources

In this shared folder you can find base models, textures, and various other resources, including examples of fully-created wearables. Feel free to leverage these resources when creating your own.

[**Wearables Reference Models**](https://drive.google.com/drive/u/1/folders/12hOVgZsLriBuutoqGkIYEByJF8bA-rAU)


# Spring Bones

Add dynamic physics to wearables with Spring Bones

### What are Spring Bones?

Spring bones (also known as jiggle bones or physics bones) are extra bones added to a wearable that move dynamically in response to avatar movement and gravity, rather than being driven by animation clips. They bring life to elements like hair, earrings, capes, belts, ponytails, and other hanging accessories by making them sway, bounce, and settle naturally as the avatar walks, runs, or turns.

Spring bones are **not** part of the base avatar armature. They are additional bones that you add to the avatar's base skeleton in Blender (or any 3D software), and their physics behavior is configured in the Builder after uploading.

This implementation follows the [VRM Spring Bone standard](https://vrm.dev/en/vrm1/springbone/), a widely adopted convention for avatar physics in formats like VRM and MMD.

![](/files/7dOClMuXOjMg68ybHmUs)

### How Spring Bones Work

A **spring chain** is a sequence of bones that simulates physics together and it must have at least two bones: the actual spring bone and an end bone. A single spring bone on its own won't produce any movement — the simulation needs the spring bone head to drive the physics and the head of the end bone will define the geometric endpoint. Longer chains (3+ bones) will have smoother, more natural movement, ideal for longers hairs hair or capes.

1. **Spring bone parent** — The first bone in the chain. It owns the physics configuration (stiffness, gravity, drag, etc.). Identified by having `springbone` anywhere in the bone name (case-insensitive).
2. **Child spring bone** — It is the child of the previous bone on the hierarchy. It inherits its parent's physics parameters and form the chain.
3. **Spring bone end** — The last bone in the chain. It defines the geometric endpoint of the chain but is not affected by simulation and it doesn't deform any meshes.

The chain, or hierarchy, for spring bones should be **linear**, which means that each bone can only have one child. Bones with two or more children may have an unexpected behaviour.

![A nice and linear spring chain.](/files/pwA4WnUkJ3COoyVzW3yw)

![Bones with 2 or more children will have unexpected behaviour.](/files/maTO7dJP3QbTlTL9uhBq)

### The Hierarchy

For spring bones to work nicely, they have to be parented to one of the avatar's original bones. For hairs and earrings, for example, the bone on top of the hierarchy should be parented to ***Avatar\_Head***. For scarves, parenting the chain to the ***Avatar\_Neck*** is a nice idea. For skirts, maybe ***Avatar\_Hips*** or ***Avatar\_LeftUpLeg/Avatar\_RightUpLeg*** could do the trick.

It's important to notice how the structure of this hierarchy works.

* *Hair\_springBone\_1* (spring bone parent): this is the bone on top of the chain, it has physics configuration
* *Hair\_springBone\_2* (child spring bone): this is the child of the previous bone in the hierarchy and inherits the configuration.
* *Hair\_springBone\_end* (spring bone end): it's the last bone of the chain and serves and endpoint only.

### Naming Convention

All spring bones **must** contain the substring `springbone` (case-insensitive) in their name. The substring can appear at any position:

* *SpringBone\_hair\_left*
* *hair\_springbone\_l*
* *springbone\_earring.R*

To keep your workflow organized, it's suggested to use this format: **BodyPart/WearableName\_springBone**

Examples: *Hair\_springBone\_1*, *Earring\_springBone.L* etc… Feel free to use to format that best suits you, as long as it's following Blender's (or your prefered software) naming convention for left and right.

{% hint style="warning" %}
Attention!

Spring bones won't work without `springbone` in the bone's name. It has to be used, even for the end bone.
{% endhint %}

### Limits

Each wearable must stay within the following spring bone limits:

* Maximum **6** spring chains per wearable
* Maximum **12** total spring bones (sum of all bones across all chains)
* Maximum chain depth of **6** bones

## Creating Spring Bones in Blender

Spring bones are additional bones that you create in Blender for the base avatar armature. The physics parameters are configured later in the Builder — you only need to set up the bone hierarchy in now.

To create a new bone, select the avatar Armature and, in **Edit Mode**, make sure you have the cursor where you want the bone to be created and press **Shift+A**. Another way to do it would be by duplicating an existing bone by pressing **Shift+D**. Once you have the first bone of the chain, press **E** to extrude it and create the rest of the chain.

![Press Shift+A to create a bone where the cursor is.](/files/AmddWoJc3KL1Y6UYLlDf)

It's important to notice that a spring chain doesn't have to be connected to the skeleton parent, so you can just place it anywhere on the mesh. However, the spring chain **has** to be connected, you can't offset any of the spring bones.

Once you create the bones, rename them following the naming convention mentioned above and make sure to parent the chain to the proper bone. Dotted lines will show the parent of the chain. If there's none, it means that the chain has no parent. In **Edit Mode**, select the child first, then select the parent and press **Ctrl+P** > **Keep Offset**.

![Parent bones by selecting the child first, then the parent and press Ctrl+P.](/files/2f6OZjpp4UCyyg6xBidt)

To rename a bone, select it in Edit Mode or Pose Mode, got to the Bone Properties tab and rename it according to the naming convention. Do this for all the bones in the chain.

![](/files/SkZ4knjS8lepS0pef0bb)

{% hint style="info" %}
Tip!

To make sure the bone is properly placed, select the mesh in **Object Mode** and, in **Edit Mode**, select the vertices in the area that you want to place the bone (it can be a loop or a group of vertices) > press **Shift+S** > **Cursor to Selected.**

Go back to **Object Mode**, select the armature > go to **Edit Mode** > select the desired bone > **Shift+S** > **Selection to cursor**.
{% endhint %}

![Use Shift+S to position the bone in the right place in the mesh.](/files/bzoYJbaV4DAsSvyTjfV0)

### Skinning the Mesh

Skinning is the process of binding the mesh to the armature, so that they move together. For this, we define how much influence (weight) each bone will have on the vertices. The more weight, the more the bone will deform the mesh. To do that, go to **Object Mode**, select the mesh first, press **Shift** and select the armature, press **Ctrl+P**. There are two ways of doing this, either select **With Empty Groups** or **With Automatic Weights**.

![](/files/BaLgqyyTV8cb9L5eDbQS)

#### With Automatic Weights

As the name says, with this method, Blender will try to set the skin weights automatically by creating vertex groups for each bone in the armature and giving each of them automatic weights. It might work in some cases, but it might also require some adjustments. You can check the groups created by clicking on the **Data** tab.

If you know for sure that you won't need certain bones to affect the mesh, you can just click on the **lock icon** to lock the groups you want, click on the dropdown menu and **Delete All Unlocked Groups** to remove them from the object. For example, if you're working on a hair, having groups for feet and hands makes no sense. In that case, delete everything that's not the head or the spring bones, like in the example below. Also make sure to delete the group for the end bone of the spring chain.

![Deleting vertex groups.](/files/LZIhfwMH092sP6ls3gQd)

#### With Empty Groups

In this method, Blender will create all vertex groups for each bone in the armature, but they will have a weight of zero by default. You will have to manually assign the weights in Edit Mode or paint them in Weight Paint mode. This gives you more control over what's being affected by each group and can be extra helpful for hard surfaces or object that need to be completely assigned to a certain group. In any case, once you've assigned the weights, they will need to be tested in Pose Mode and then tweaked in Weight Paint.

![Parenting with empty groups.](/files/E38KkUG7CbIvp1f6ccf3)

#### Painting Weights

To test the skinned mesh, select the armature and go to **Pose Mode**, set a key frame, then rotate the bones to create another pose and set another keyframe. That way you can check how the mesh is deforming with movement. Once you have the poses set, go back to **Object Mode**, select the mesh and go to **Weight Paint**.

![](/files/qQlf6tWHh0qIZ1ZLjytN)

In **Weight Paint**, in the Tools tab you will find different brushes to tweak the skin weights. Select the Vertex Group you want to edit (if they are locked, just unlock them so you can edit edit the influence) and use the brush to add or remove influence. Black means zero influence, while red means that that group completely influences the mesh. Enabling the wireframe on **Overlays** will make it easier to see what you are painting.

![](/files/9o2vALiRFB9UJLZS1PrT)

Use the add, subtract or smooth brushes to get the desired result. Test different extreme poses too to see how the mesh is deforming and if there are no vertex left without weights. If you're happy with the result, it's time to export it!

### Exporting

Before exporting, make sure to delete any animation clip created when testing the poses. Go to Pose Mode, select all the bones by pressing **A** and press **Ctrl+R**, then **Ctrl+S** and finally **Ctrl+G** to delete any transforms on your armature. Then go back to object mode, change the Display Mode from View Layer to Blender File, expand Actions and right click and delete the animation file.

![](/files/8nRZWBL3s2stcN7x2oVi)

If you have any other objects in your scene, like avatar mesh, turn the visibility off by clicking on the eye icon in the Outliner. Then, go to **File** > **Export** > **gltf 2.0 (.glb, .gltf)**. For the export settings, expand Include and in **Limit to** toggle **Visible Objects**. Click on Export and you're ready to upload your file to the Builder!

![](/files/wNzL0RYpbrE5QyPtJ1HK)

## Configuring Spring Bones in the Builder

After uploading a wearable that contains `springbone`-named bones, the Builder automatically detects them and shows the **Spring Bones** configuration panel.

![](/files/9nvGynVM8EDCa1a5l6nG)

From this panel you can configure the physics parameters for each spring root bone. The avatar preview in the Builder will immediately reflect your changes, so you can fine-tune the behavior in real time.

{% hint style="info" %}
You cannot add new spring bones from the Builder. The bones must already exist in the uploaded `.glb` file with the correct naming convention. The Builder only lets you configure the physics parameters for detected spring bones.
{% endhint %}

### Parameter Reference

#### Stiffness Force

|             |        |
| ----------- | ------ |
| **Range**   | 0 to 4 |
| **Default** | `2.0`  |

Controls how strongly the bone tries to return to its rest pose. This is the restoring force — think of it as the "firmness" of the spring.

* **0**: The bone won't return to rest at all — it will just hang limply under gravity.
* **Low values** (e.g., 0–1): The bone is loose and saggy, swinging freely. Good for long flowing hair or lightweight hanging accessories.
* **High values** (e.g., 3–4): The bone is stiff, staying close to its original position and snapping back quickly. Good for short hair or rigid accessories.

#### Gravity Power

|             |        |
| ----------- | ------ |
| **Range**   | 0 to 2 |
| **Default** | `0`    |

Controls the magnitude of the gravity force pulling on the bone each frame.

* **0**: No gravity effect — the bone is only affected by movement inertia and stiffness.
* **Low values** (e.g., 0.3–0.8): Subtle gravity pull, good for most accessories.
* **High values** (e.g., 1.5–2.0): Strong gravity pull, causing the bone to droop heavily.

#### Gravity Direction

|             |                                |
| ----------- | ------------------------------ |
| **Format**  | X, Y, Z vector                 |
| **Default** | `X: 0, Y: -1, Z: 0` (downward) |

Sets the direction of the gravity force in world space. By default, gravity pulls downward (Y = -1), simulating natural gravity.

| X  | Y  | Z  | Effect                                |
| -- | -- | -- | ------------------------------------- |
| 0  | -1 | 0  | Downward (natural gravity, default)   |
| 0  | 1  | 0  | Upward (floating/supernatural effect) |
| 1  | 0  | 0  | Leftward                              |
| -1 | 0  | 0  | Rightward                             |
| 0  | 0  | 1  | Forward                               |
| 0  | 0  | -1 | Backward                              |

You can combine axes (e.g., `X: 0.5, Y: -0.5, Z: 0`) for diagonal directions. This is useful for simulating wind-like effects or creating a floating appearance for supernatural characters.

#### Drag Force

|             |       |
| ----------- | ----- |
| **Range**   | 0 – 1 |
| **Default** | `0.5` |

Controls how quickly the bone loses momentum and settles down. Think of it as air resistance or damping.

* **Low values** (e.g., 0–0.2): The bone swings freely for a long time before settling, like a pendulum with little friction.
* **High values** (e.g., 0.7–1.0): The bone settles almost instantly after movement, giving a heavy or dampened feel.
* **1**: The bone barely moves at all — maximum deceleration.

#### Center (Optional)

|             |                      |
| ----------- | -------------------- |
| **Format**  | Bone name (dropdown) |
| **Default** | None                 |

An optional reference bone used to calculate the spring bone's movement relative to a point on the avatar, instead of relative to world space. This prevents the spring chain from swaying excessively when the avatar moves around (walking, running).

**Without a center bone**, springs calculate inertia in world space — every step the avatar takes causes the bones to react as if the whole world moved, resulting in exaggerated swinging during locomotion.

**With a center bone**, the simulation uses that bone's space as the reference frame, so only the avatar's *local* movements (head turning, body bending) trigger the spring reaction.

Choose the center bone based on where the wearable is located on the body:

| Wearable location                     | Recommended center bone |
| ------------------------------------- | ----------------------- |
| Head (hair, earrings, tiaras)         | `Avatar_Head`           |
| Upper body (capes, necklaces)         | `Avatar_Spine`          |
| Lower body (belts, skirt accessories) | `Avatar_Hips`           |

{% hint style="warning" %}
The center bone **must not** be part of any spring chain. It should be a bone from the base avatar armature.
{% endhint %}

## Common Use Cases & Recommended Values

These are suggested starting points. Adjust to taste using the Builder's real-time preview.

| Use case                | Stiffness | Gravity Power | Gravity Dir | Drag      | Center         | Notes                                                 |
| ----------------------- | --------- | ------------- | ----------- | --------- | -------------- | ----------------------------------------------------- |
| Long hair / ponytail    | 1.0 – 2.0 | 0.3 – 0.8     | 0, -1, 0    | 0.3 – 0.5 | `Avatar_Head`  | More bones in the chain = smoother movement           |
| Short hair              | 3.0 – 4.0 | 0 – 0.3       | 0, -1, 0    | 0.4 – 0.6 | `Avatar_Head`  | Higher stiffness keeps hair close to the head         |
| Earrings                | 0.5 – 1.5 | 0.5 – 1.0     | 0, -1, 0    | 0.4 – 0.6 | `Avatar_Head`  | Short chain (2–3 bones), lower stiffness for dangling |
| Cape / cloak            | 1.0 – 2.0 | 0.5 – 1.0     | 0, -1, 0    | 0.3 – 0.5 | `Avatar_Spine` | Multiple parallel chains for width                    |
| Belt / hanging ornament | 1.5 – 2.5 | 0.3 – 0.8     | 0, -1, 0    | 0.5 – 0.7 | `Avatar_Hips`  | Higher drag for heavier items                         |
| Floating / ghost effect | 1.0 – 2.0 | 0.5 – 1.0     | 0, 1, 0     | 0.3 – 0.5 | `Avatar_Spine` | Upward gravity for supernatural look                  |

## Limitations

Keep the following limitations in mind when working with spring bones:

* **No colliders**: Spring bones do not collide with the avatar's body or other bones. Chains may clip through the body mesh in extreme poses. Future versions may add collider support.
* **No cross-wearable interactions**: Each wearable's spring chains are independent. Chains from different wearables don't affect each other.
* **No global wind**: There is no scene-level wind force. You can approximate a wind effect per-wearable by adjusting the `gravityDir` to a diagonal direction.
* **Performance on remote avatars**: Spring bone simulation is disabled for avatars that are far from the local player to save performance. Nearby avatars will display spring bone physics normally.
* **Alternative clients compatibility**: Wearables with spring bones are backward-compatible with alternative clients and older Explorer versions, but the spring bone elements will remain static. In some cases, there may be minor visual issues.

## Technical Reference

Spring bone physics uses two separate artifacts that work together:

1. **The `.glb` file** carries only the bone names (with the `springbone` token) and their hierarchy. No physics parameters are stored in the model file.
2. **The wearable's item metadata** (`wearable.data.springBones`) carries all physics parameters as JSON.

When you configure parameters in the Builder, they are saved into the wearable's item metadata — the `.glb` file is never modified by parameter edits.

You don't need to interact with this format directly — the Builder handles reading and writing it. This section is provided for reference.

### `.glb` Node Hierarchy (example)

The model file contains only the bone names and parent-child relationships:

```json
{
  "asset": {"version": "2.0"},
  "nodes": [
    {"name": "Avatar_Head", "children": [1, 2]},
    {"name": "SpringBone_earring_r", "children": [3]},
    {"name": "SpringBone_hair_left", "children": [4]},
    {"name": "springbone_earring_r_tip"},
    {"name": "SpringBone_hair_left_tip"}
  ]
}
```

### Item Metadata (`wearable.data.springBones`)

The physics parameters are stored in the wearable's metadata, keyed by the GLB content hash:

```json
{
  "version": 1,
  "models": {
    "bafkreialsvt77jvpy673cnugp5ggnxfaalfncufweayuk3jbxskh3pelkm": {
      "SpringBone_earring_r": {
        "stiffness": 0.5,
        "gravityPower": 1.0,
        "gravityDir": [0, -1, 0],
        "drag": 0.6,
        "isRoot": true,
        "center": "Avatar_Hips"
      },
      "SpringBone_hair_left": {
        "stiffness": 2.0,
        "gravityPower": 0.8,
        "gravityDir": [0, -1, 0],
        "drag": 0.4,
        "isRoot": true
      }
    }
  }
}
```

* `models` is keyed by the GLB content hash. Wearables whose male and female representations share the same `.glb` have a single entry.
* Each bone entry uses the exact node name from the `.glb` (case-sensitive).
* Tip bones (e.g., `springbone_earring_r_tip`) do not need a metadata entry — they serve only as geometric endpoints.

### Metadata Parameters

| Parameter      | Type    | Default      | Description                                                                            |
| -------------- | ------- | ------------ | -------------------------------------------------------------------------------------- |
| `stiffness`    | float   | `2.0`        | Restoring force toward rest pose. Range: 0–4.                                          |
| `gravityPower` | float   | `0`          | Magnitude of gravity force. Range: 0–2.                                                |
| `gravityDir`   | vec3    | `[0, -1, 0]` | Direction of gravity in world space.                                                   |
| `drag`         | float   | `0.5`        | Damping / deceleration factor. Range: 0–1.                                             |
| `isRoot`       | boolean | —            | Whether this node is the root of a spring chain. Required to be `true` for root bones. |
| `center`       | string  | —            | Optional. Name of a reference bone for relative inertia calculation.                   |


# Linked Wearables

Wearable Representations Of 3rd Party Tokens

## About

In accordance with the [initial DAO proposal for Linked Wearables](https://governance.decentraland.org/proposal/?id=14e76cc0-2bc7-11ec-ac84-77607720a240) (previously called: Third Party Wearables), the [Draft Proposal with final definitions](https://governance.decentraland.org/proposal/?id=f69c4d40-aaaf-11ec-87a7-6d2a41508231) and the [Linked Wearables Redesign proposal](https://decentraland.org/governance/proposal/?id=65caf8d1-8601-49a5-ae11-b0b99d7fdd3c), this document will serve as documentation to cover all the relevant details around the Linked Wearables feature.

This document is mostly oriented for representatives of NFT communities that want to give their users the ability to represent their NFTs as wearables when strolling through Decentraland.

## What are Linked Wearables?

Linked Wearables are 3D representations of NFTs that originate from outside Decentraland that can be used as wearables in-world, can be equipped on the avatar, and are found in the backpack. They are not [regular wearables](https://github.com/decentraland/docs/blob/main/creator/wearables-and-emotes/wearables/README.md#what-are-wearables). They look the same, and follow the regular wearables [guidelines](/creator/wearables-and-emotes/wearables/creating-wearables) but carry a completely different meaning.

Linked Wearables do not exist inside traditional wearable collections (they belong to a special type of collection), have no rarity, and can not be sold in [primary](https://market.decentraland.org/browse?assetType=item\&section=wearables) or [secondary](https://market.decentraland.org/browse?assetType=nft\&section=wearables\&vendor=decentraland\&page=1\&sortBy=recently_listed\&onlyOnSale=true\&viewAsGuest=false\&onlySmart=false) markets. They are only **in-world representations linked to external NFTs.**

> Imagine that you have an NFT project called ‘Cryptojackets’ where every NFT is a different kind of 2D jacket and you want your users to have a 3D representation of their jacket in their Decentraland backpack. Linked Wearables allows you to submit 3D representations of your NFTs as wearables in Decentraland. There is no need to mint a new token, and your current NFT project will have a new out-of-the-box feature to offer!

All Linked Wearables are defined inside of a **Linked Wearable Collection**. We'll see how to create one further down into the article.

## How do Linked Wearables represent NFTs?

Wearables are linked to your NFTs by creating a Linked Wearable Collection in the [Builder site](https://decentraland.org/builder) and setting how your NFTs will be represented at the time of creating the wearables.

We support 4 mechanisms to link your wearables to NFTs. All of these mechanisms use the token id of the NFTs to match them.

The following table shows the mentioned mechanisms:

| Match         |                                                                                                                                                                                                                                             |
| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| All NFTs      | A user owning any of the NFTs of the collection will own the wearable                                                                                                                                                                       |
| Single NFT    | A user owning an NFT specified by TOKEN ID will own the wearable. *e.g. 123456. The user will own the wearable if they own the NFT with TOKEN ID: 123456*                                                                                   |
| Multiple NFTs | A user owning one of many NFTs specified by TOKEN IDs, described as separated by a comma will own the wearable. *e.g. 123456, 123457, 123458. The user will own the wearable if they own the NFT with TOKEN ID: 123456 or 123457 or 123458* |
| Range of NFTs | A user owning one of many NFTs specified in the range of TOKEN IDs will own the wearable. *e.g. \[1, 1000]. The user will own the wearable if they own the NFT with TOKEN ID 1 or 2 or 3 or 4 or 5 ... or 100*                              |

## Types of Linked Wearables Collections

Usually there are two types of NFT collections:

* **Hand crafted:** where each token asset is tailored made, or made by hand, without any automatization process.
* **Programmatic:** where each token asset was not crafted individually by hand, but automatically generated with code, many times from traits that were previously designed and modeled. For example: [CryptoPunks](https://opensea.io/collection/cryptopunks) and [BAYC](https://opensea.io/collection/boredapeyachtclub) are examples of 2D pfp NFT Collections that were created programmatically.

We follow the same principle in Decentraland with the Linked Wearables Collections as well, there can be Standard Linked Wearable Collections for the hand crafted collections and Programmatic Linked Wearable Collections for the automatically generated ones. Both collections differ in the costs of publishing publishing fees the wearable have. Check the [Costs section](#costs) for more information about the publishing fees.

## Creating Linked Wearables

## Creating a Linked Wearable Collection

Creating a Linked Wearable collection is the first step into creating our Linked Wearables.

Linked Wearables are grouped in collections that can be created, edited and deleted by their owners. Each collection can contain an arbitrary number of Linked Wearables. Each collection will be linked to an NFT collection, for that reason, **an NFT contract (ERC721 or ERC1155 compatible) is required to create a Linked Wearable Collection.**

To create a new Linked Wearable follow these steps:

1. In the Collection's section, click on the **Create Collection** button.

   ![](/files/LA07xiWJygLY3y3WiBax)
2. Select the Linked Wearable Collection option by click on the **Create Collection** button under the Linked Collections section.

   ![](/files/YZ4VqMXbEJDlP9pkC2xY)
3. Choose a name for the collection and link the collection to your NFT collection by setting its contract address and the network it is in. **The contract will be validated to be sure it complies with the NFT contracts standards.**

   ![](/files/nBa94qX9BlxOagn2KFcw)
4. Click on the **Create** button to create the collection.

## Adding Wearables to the Linked Wearables Collection - One by One

It's possible to, as it already happens with standard wearables, upload your wearables' 3D models one by one.

To do so, follow these steps:

1. Click on the **New items** button.

   ![](/files/FQAfV8khz7TdoKH6Z5r5)
2. Select the **Singe items** option.

   ![](/files/ckUWuTGsdR2WJGpSHCll)
3. Follow the steps to upload and configure your wearable as it is described in the [creating wearables guidelines](/creator/wearables-and-emotes/wearables/creating-wearables) and configure how it will be linked to your NFTs. Check the "[How do Linked Wearables represent NFTs?](#how-do-linked-wearables-represent-nfts)" section for more information on how to configure it.

   ![](/files/GQTXWLJO8b4OzHrF7Mgi)

## Adding Wearables to the Linked Wearables Collection - In Bulk

As Linked Wearable collections can contain a big number of items, it is possible to upload the 3D models and the information of the wearables in bulk. This process involves creating a zip file with all the assets an item needs for each of the items. **Uploading wearables in bulk is recommended only for programmatic collections**.

### Building the Wearable ZIP

Each item will require a ZIP file to be built including the following assets:

* The **required** 3D model files of the wearable (GLB, GLTFs, texture files, etc).
* A **required** `wearable.json` file containing the information of the wearable.
* An **optional** `thumbnail.png` file containing the thumbnail of the wearable that will be seen in the Builder and the world. If it is not provided, one will be generated using the 3D model.

The 3D models and the optional `thumbnail.png` follow the [Custom Thumbnails section](/creator/wearables-and-emotes/manage-collections/uploading-wearables#custom-thumbnails) in the Uploading Wearables article on how to create a custom thumbnail.

The `wearable.json` accompanying the content of the wearables has the following format (typed as Typescript would):

```typescript
type WearableConfiguration = {
  /** The URN of the wearable */
  id?: string
  /** Name of the wearable */
  name: string
  /** Description of the wearable */
  description?: string
  data: {
    /** Wearables to replace when equipping the wearable */
    replaces: WearableCategory[]
    /** Wearables to hide when equipping the wearable */
    hides: WearableCategory[]
    /** Tags to identify the wearable */
    tags: string[]
    /** Representations of the wearable */
    representations: WearableRepresentation[]
    /** Category of the wearable */
    category: WearableCategory
  },
  /** The mapping definition of the wearable with NFTs */
  mapping: Mapping
}

type WearableRepresentation = {
  /** Body shape of the representation */
  bodyShapes: BodyShape[];
  /** File path to the main file of the representation (GLB, GLTF, etc) */
  mainFile: string;
  /** A list of the file paths of the files that belong to the representation */
  contents: string[];
  /** Wearables to hide when equipping this representation */
  overrideHides: WearableCategory[];
  /** Wearables to replace when equipping this representation */
  overrideReplaces: WearableCategory[];
}

enum WearableCategory = {
  EYEBROWS = 'eyebrows',
  EYES = 'eyes',
  FACIAL_HAIR = 'facial_hair',
  HAIR = 'hair',
  HEAD = 'head',
  BODY_SHAPE = 'body_shape',
  MOUTH = 'mouth',
  UPPER_BODY = 'upper_body',
  LOWER_BODY = 'lower_body',
  FEET = 'feet',
  EARRING = 'earring',
  EYEWEAR = 'eyewear',
  HAT = 'hat',
  HELMET = 'helmet',
  MASK = 'mask',
  TIARA = 'tiara',
  TOP_HEAD = 'top_head',
  SKIN = 'skin'
}

enum WearableBodyShape {
  MALE = 'urn:decentraland:off-chain:base-avatars:BaseMale',
  FEMALE = 'urn:decentraland:off-chain:base-avatars:BaseFemale'
}

type Mapping = SingleMapping | AnyMapping | RangeMapping | MultipleMapping

enum MappingType {
  SINGLE = 'single',
  ANY = 'any',
  MULTIPLE = 'multiple',
  RANGE = 'range'
}

type SingleMapping = {
  type: MappingType.SINGLE
  id: string
}

type AnyMapping = {
  type: MappingType.ANY
}

type RangeMapping = {
  type: MappingType.RANGE
  from: string
  to: string
}

type MultipleMapping = {
  type: MappingType.MULTIPLE
  ids: string[]
}
```

The following is an example of a `wearable.json` file that contains a model for each body shape:

```json
{
  "id": "urn:decentraland:matic:collections-thirdparty:my-third-party:my-collection:1",
  "name": "Special hat",
  "description": "A description of the wearable",
  "data": {
    "replaces": [],
    "hides": ["hair"],
    "tags": ["special", "new", "hat"],
    "representations": [
      {
        "bodyShapes": ["urn:decentraland:off-chain:base-avatars:BaseMale"],
        "mainFile": "aMaleModelFile.glb",
        "contents": ["aMaleModelFile.glb", "aTextureFile.png"],
        "overrideHides": [],
        "overrideReplaces": []
      },
      {
        "bodyShapes": ["urn:decentraland:off-chain:base-avatars:BaseFemale"],
        "mainFile": "aFemaleModelFile.glb",
        "contents": ["aFemaleModelFile.glb", "anotherTextureFile.png"],
        "overrideHides": [],
        "overrideReplaces": []
      }
    ],
    "category": "hat",
    "mapping": {
      "type": "single",
      "id": "123"
    }
  }
}
```

This file will be zipped alongside the `aMaleModelFile.glb`, `aTextureFile.png`, `aFemaleModelFile.glb` and `anotherTextureFile.png`.

To add a custom thumbnail to the wearable, you can add a `thumbnail.png` file.

Some things to consider about the `wearable.json` file:

* All the information about the wearable categories and which to choose can be found in the [creating wearables guidelines](/creator/wearables-and-emotes/wearables/creating-wearables).
* The representations array will contain the information about how each body shape will look like. Each wearable MUST contain at least one representation (it can have one or the two of them), that is, taking into consideration the body shapes that we currently have, either `urn:decentraland:off-chain:base-avatars:BaseMale` or `urn:decentraland:off-chain:base-avatars:BaseFemale`. Each representation will describe which models will be used for each body shape.
* The mapping object must be configured as one of the available mechanisms to link your NFT to your wearable, following the "[How do Linked Wearables represent NFTs?](#how-do-linked-wearables-represent-nfts)" section.

**Setting a custom ID or URN for the items**

The `id` field is optional and can be used to create a wearable with an specific ID to be updated in the future in Bulk (which is explained further in the [Editing wearables in bulk](#editing-wearables-in-bulk) section).

In case the `id` field is used, it must contain the whole ID of the wearable. The ID (or URN) of the wearable is written as `urn:decentraland:matic:collections-thirdparty:third-party-id:collection-id:item-id`. Where, `urn:decentraland:matic:collections-thirdparty:third-party-id:collection-id` can be retrieved from the collection page and the `item-id` is the custom identifier of the item you would like to use.

IDs or URNs follow a specific format, they accept:

* Lowercased characters, from the `a` to the `z`.
* All numbers.
* They can't contain other type of characters or whitespaces. We suggest you replace whitespaces with the `-`

You can retrieve the ID (or URN) from the collection page by following the next steps:

1. Going into the collection view you want to copy the URN from and clicking the Edit URN option in the options menu:

![](/files/Kzg6svU57YsBUd3kl3R6)

2. Copying the identifier that's below the the text field:

![](/files/0P1paKBPHdYG7CDn5cl6)

For example, if the URN or ID retrieved from the UI for the collection is `urn:decentraland:matic:collections-thirdparty:my-third-party:my-collection` and you're identifying your wearables numerically, the URN for the example would be `urn:decentraland:matic:collections-thirdparty:my-third-party:my-collection:1`, being `1` the number of the wearable.

### The upload process

Once all the files are ready, to upload the wearables in bulk, follow these steps:

1. Click on the **New items** button.

   ![](/files/FQAfV8khz7TdoKH6Z5r5)
2. Select the **Multiple items** option.

   ![](/files/ckUWuTGsdR2WJGpSHCll)
3. Click on the **Browse yor computer** link to open your file manager and select all the zips containing your wearables.

   ![](/files/xWZ4G9aU4EdIg4FBwlCj)
4. Review if all the files are correct or if they need to be fixed. In this case, the model of the wearable isn't set or the `wearable.json` file has an incorrectly set representation.

   ![](/files/aoU33ZwmIOSpvC8nf0GR)
5. Fix any errors by clicking the **Add more** button and re-uploading the failed files with the same name or by dismissing the errors using the trash icon on the top right section of the modal.

   ![](/files/grEtbnnUikg2mMGF05TP)
6. Upload all wearables by clicking **Upload items**.

   ![](/files/757LKZaTV5Jp9qmgVO3p)
7. Be patient, this might take a while!

   ![](/files/clDRmcacLmoDMb002Uxg)
8. Success! Your items are now available in your collection.

   ![](/files/aAxriKMCp1HCR2k77KsR)
9. Select if your collection is a programmatic or a standard one. Check the [NFT Collections & Linked Wearables Collections](#nft-collections--linked-wearables-collections) section to correctly set which collection type you're building items for.

   ![](/files/HgpAtpTAvsDWtkYUBkXi)

### Common errors when uploading batched items

* The `id` field is set to a value that is already being used by another wearable.
* The `id` field is set to a value that is not a valid ID. For example, the third party id or collection id belong to another third party or collection.
* There's no `wearable.json` file in the zip.
* The ZIP file doesn't have in its root directory the `wearable.json` file.
* The `wearable.json` has an incorrect format or values.
* The file is bigger than 3MBs. Linked Wearables have the same limitation as regular wearables in terms of size as the standard ones.
* The custom optional thumbnail image is not a png file.

## Seeing the wearables in Decentraland

Linked Wearables can be seen in world to review how the model will work once published and approved.

To be able to see a wearable in world, follow these steps:

1. Click on the meatballs menu (three horizontal dots) on the right of the item that you want to see in world. A dropdown will appear. Select **See in Decentraland**.

   ![](/files/YsQuoEwCITaYujtqPTol)
2. The Decentraland World will open. Navigate to your backpack to see the wearable.

   ![](/files/NCtMzEi3g6Ux3lEOWZIv)

{% hint style="warning" %}
**⚠️ Notice**: The in world preview works with the Outdated Web Version of the Decentraland Client. It is not possible to test them yet in the Decentraland Desktop Client 2.0.
{% endhint %}

## Editing Linked Wearables

## Editing the collection name

A collection can be renamed by its creator **only if the collection has no published wearables**.

To edit the name of a Linked Wearable Collection follow these steps:

1. Click on the collection name.

   ![](/files/BnCmTIxmaWx9F4O3j0B3)
2. Choose a new name for the collection and click on the save button.

   ![](/files/CSfPGGcIH35wVq1RqYKV)

## Deleting the collection

A collection can be delete by its owner **only if the collection has no published wearables**.

To delete Linked Wearable Collection follow these steps:

1. Click on the meatballs menu (three horizontal dots) on the far right of the set of buttons. A dropdown will appear. Select **Delete**.

   ![](/files/Kzg6svU57YsBUd3kl3R6)
2. A Confirmation modal will appear, if you wish to proceed, click **Ok**, otherwise click on **Cancel**.

   ![](/files/Uaz9dg1DzXs4KKGZOa1d)

## Editing a single wearable

### Editing wearable properties

To edit a single wearable, follow these steps:

1. Click on the meatballs menu (three horizontal dots) on the right of the item that you want to see in world. A dropdown will appear. Select **Open in editor**.

   ![](/files/NlLGMl8wa7C0ZuZfxXFL)
2. Edit the wearable as standard wearables are edited. Follow the **Editing items** section in [creating wearables guidelines](/creator/wearables-and-emotes/wearables/creating-wearables) on how to create a custom thumbnail.

### Editing the wearable linking

The linking of the wearables with the NFT collection is on of the most important properties of a Linked Wearable. To edit how they're linked to the NFTs, you can quickly change the linking value from the collection view, without the need to navigate to other page.

![](/files/wTHPYKxvxtG4yB8cyUjj)

Check the "[How do Linked Wearables represent NFTs?](#how-do-linked-wearables-represent-nfts)" section for more information on how to link your wearables.

## Editing wearables in bulk

Following the same idea previously seen in the [Creating wearables in bulk](#creating-linked-wearables-in-bulk) section, third party managers can make changes to the wearables in bulk.

To make changes in bulk to wearables, it is necessary to create a ZIP file for each of the wearables that will be changed.

These ZIP files must be created following the format described in [Creating wearables in bulk](#creating-linked-wearables-in-bulk) with one exception, in the `wearable.json` file, the `id` property **MUST** be set to the `id` or URN of the wearable that will be changed. This is mandatory as it's the only way to identify the wearable to be changed. If you created your wearables in bulk by providing an id in the `wearable.json` file, you can re-use their `wearable.json` files to update them.

Taking into consideration the example in the [Creating wearables in bulk](#creating-linked-wearables-in-bulk) section, if we would like to change some of the properties of a wearable, for example, the name where we forgot to add a number to it, we should include a `wearable.json` file in the zip as the next example:

```json
{
  "id": "urn:decentraland:matic:collections-thirdparty:my-third-party:my-collection:1",
  "name": "A hat 1",
  "description": "A description of the wearable",
  "data": {
    "replaces": [],
    "hides": ["hair"],
    "tags": ["special", "new", "hat"],
    "representations": [
      {
        "bodyShapes": ["urn:decentraland:off-chain:base-avatars:BaseMale"],
        "mainFile": "aMaleModelFile.glb",
        "contents": ["aMaleModelFile.glb", "aTextureFile.png"],
        "overrideHides": [],
        "overrideReplaces": []
      },
      {
        "bodyShapes": ["urn:decentraland:off-chain:base-avatars:BaseFemale"],
        "mainFile": "aFemaleModelFile.glb",
        "contents": ["aFemaleModelFile.glb", "anotherTextureFile.png"],
        "overrideHides": [],
        "overrideReplaces": []
      }
    ],
    "category": "hat"
  },
  "mapping": {
    "type": "single",
    "id": "123"
  }
}
```

Where the `id` field is set to the `id` or URN of the wearable that will be changed and the `name` field is set to the new name of the wearable.

Once the ZIP files are ready, follow these steps to edit the items in bulk:

1. Click on the meatballs menu (three horizontal dots) on the far right of the set of buttons. A dropdown will appear. Select **Edit in bulk**.

   ![](/files/YBHHY7abUWYFCkp8b5gd)
2. A modal similar to de one in the **Uploading models in bulk** will appear. Click on the **Browse your computer** link to open your file manager.

   ![](/files/73Nw8RMe6KqmoHhvFU7s)
3. Select all the ZIP files of the items that will be edited.

   ![](/files/xWZ4G9aU4EdIg4FBwlCj)
4. Review if all the files are correct or if they need to be fixed. In this case, the model of the wearable isn't set or the `wearable.json` file has an incorrectly set representation.

   ![](/files/hfaROUsm0CBQgwkZv17X)
5. Fix any errors by clicking the **Add more** button and re-uploading the failed files with the same name or by dismissing the errors using the trash icon on the top right section of the modal.

   ![](/files/grEtbnnUikg2mMGF05TP)
6. Upload all wearables by clicking **Upload items**.

   ![](/files/ehDvFnra8Nrs9ScpBjqw)
7. Be patient, this might take a while!

   ![](/files/JU66tFV9kfZoGu7CJ5Ay)
8. Success! Your items are now available in your collection. Check the forum post for any updates from the curator.

   ![](/files/FzNSHgPCG6Ufdl652Jtl)

## Publishing your Linked Wearables

Your Linked Wearables need to go through a publishing and curation process as the regular wearables do. Although the publication and curation process is not the same as the one for the regular wearables, it keeps the same steps, all items must be first be published to later be curated by an assigned curator.

The following sections will show you how to publish your Linked Wearables to be curated.

## Costs

Creating Linked Wearables has a cost depending on the type of Linked Wearable Collection you chose to build:

1. **Standard**: each published wearable costs the same as a regular wearable: USD 100 payable in MANA.
2. **Programmatic**: a fixed fee, payed once for all the wearables you'll be publishing. This fee equals publishing 20 regular wearables: 2000 USD payable in MANA.

For more information about the type of collection you're creating, check the [NFT Collections & Linked Wearables Collections](#nft-collections--linked-wearables-collections) section.

## Publishing wearables for review

Once your wearables are ready, they must be published for curation. Your wearables are published in groups of items, you can choose which items are ready to be curated by selecting them and clicking the `Publish` button. After publishing items, publishing will be blocked until the ones that are already published are curated.

To publish your wearables, you need to:

1. Select the items to be published by clicking on the checkbox next to them. Click the **Publish** button when you're ready with your selection.

   ![](/files/8yWeu46ZnniONLmefVyn)
2. Confirm your collection name. Once you published your items, changing the collection name is not possible, so be sure to check it thoroughly.

   ![](/files/8yWeu46ZnniONLmefVyn)
3. Give it a check to the item's your publishing. Click the **Confirm items** button when you're ready.

   ![](/files/Nf6Fgehs18kHd217Xg6b)
4. Sign the confirmation of publishing your items in your wallet.

   ![](/files/brlNmCk17vlhY1g1MdAE)
5. Read and check the Terms and Conditions.

   ![](/files/L1QRngKJDXyiEi3p0QyF)
6. Check your publishing fees. The fees required for published the wearables are described in the [Costs section](#costs).

   ![](/files/8RBxZf8rPCe2XoWVN3zx)
7. If it's your first time publishing Linked Wearables, you'll need to authorize the Linked Wearables smart contract to operate MANA on your behalf. This step is needed to deduct the MANA used to pay the publication fees from your wallet.

   ![](/files/JtsppTvMmq7Lm35MAMiW)
8. Pay the publication fee and complete the publishing by performing the transaction. Depending on the congestion of the network, this might take a while.

   ![](/files/1HrBQIZpUuiE6OeTt56H)
9. Success! You have published your items. Your items will go through the curation process a regular collections do. You can communicate with the curator via the forum post.

   ![](/files/ylz8t886auI42aN3nWE5)

## Pushing changes for review

Published and approved wearables that are edited need to go through the curation process again. Don't worry, there won't be any fees applied to already published wearables.

To push changes to get them curated, you need to:

1. Select the items with changes by clicking on the checkbox next to them. Click the **Push changes** button when you're ready with your selection.

   ![](/files/I4HByFe0lgGaZp9KQ5VN)
2. Proceed with the push changes process. As the modal says, these changes will need to go through the curation phase once again.

   ![](/files/XjT1P4TyTxMwLBjM7gP9)
3. Read and check the Terms and Conditions. Upon accepting them, the items will be ready to be curated again.

   ![](/files/gAKbMoQj1PeiLGvevv8I)

## Curation

As with regular wearables, your 3D models will need to get the Curators Committee’s approval. You are not excluded from this rule as Decentraland’s aesthetic and gameplay still needs to be safe guarded.

The curation process will differ according to the process used to generate the wearables. Linked Wearables collections admit handcrafted and programmatically generated wearables.

### Handcrafted wearables

For 3D models that were made individually without any automated process (the usual method for most regular wearables) the Curator will need to go through all items in the collection individually to make sure they are all compliant with the [Wearable Guidelines](/creator/wearables-and-emotes/wearables/creating-wearables).

### Programmatic collections

For programmatic collections, not all items have to be curated individually. The number of items to be curated in each collection depends on the collection’s size, this was defined by the DAO in [this proposal](https://governance.decentraland.org/proposal/?id=f69c4d40-aaaf-11ec-87a7-6d2a41508231).


# Emotes

An overview of emotes NFTs for Decentraland


# Creating Emotes

Tips and guidelines for creating Decentraland Emotes.

This documentation will cover the file specifications, the basics of animation in Blender, the proper way to export an Emote, and how to import one into the Builder.

{% hint style="info" %}
**💡 Tip**: Install the [Decentraland Tools Blender plugin](https://extensions.blender.org/add-ons/decentraland-tools/). It includes several handy functions to help you edit and export 3D models, wearables, and emotes.
{% endhint %}

#### Animation Specs Chart

| Frame Rate             | 30 fps                           |
| ---------------------- | -------------------------------- |
| Max Length             | 10 seconds (300 frames)          |
| Animations per File    | 1                                |
| Export Format          | .glb                             |
| Sampling Rate          | 1 by default (2 or 3 if needed)  |
| Max File Size          | 1 MB                             |
| Max Animation Distance | 1 meter (front/back, left/right) |
| Max Animation Height   | 4 meter                          |

You can find a more detailed explanation of the animation specifications [**below**](#the-animation-specifications).

### **Resources**

This documentation explains the set up for Rig 1.0, its controls, and features.

[Decentraland Blender Rig](https://github.com/decentraland/docs/blob/main/creator/images/emotes/Avatar_File.blend)

{% hint style="info" %}
If you're using Maya you can download this [Maya Rig](https://github.com/decentraland/docs/blob/main/images/emotes/DCL_Maya_Rig.ma) and [picker](https://github.com/decentraland/docs/blob/main/images/emotes/emoteAvatar.pkr) provided by [SparkleStudios](https://www.sparkles.studio/) ❤️.
{% endhint %}

## **Before Starting**

### **Frame Rate**

Before getting started, it’s important to check the frame rate. Decentraland’s animations must have a frame rate of 30 fps. The rig file provided probably has that set up, but since Blender’s default value is 24 fps, it is best to double check before starting (a wrong frame rate will affect the speed of the animation). That option can be found in Output Properties (the printer icon) under Format, as shown below:

![Make sure the framerate is set to 30 fps before starting.](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/framerate.png)

Make sure the framerate is set to 30 fps before starting.

### **Pose Mode**

In Blender, a rig can be viewed in three different modes: Object Mode, Edit Mode, and Pose Mode. Animations can only be done in Pose Mode (in that mode, controls have colors). With the rig selected, you’ll find that option in a dropdown menu, at the top right.

![Changing to Pose Mode.](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/changing_pose_mode.gif)

Changing to Pose Mode.

### **Interface for Animations**

In the rig file, other than the two windows for the viewport (front and side view), there are three more at the bottom: a ***Graph Editor***, ***a Dope Sheet***, and a ***Timeline***.

* ***Graph Editor***: In this editor, it is possible to edit the animation curves of each transform property of the selected controls. Those curves show how the interpolation is being calculated and they can be edited to achieve the wanted effect in the animation. Both in here and in the dope sheet the ***Only Show Selected*** tool is toggled, which means it’ll only include channels related to the selected control. This can be turned on and off by simply clicking on the arrow icon.
* ***Dope Sheet***: Here you can edit the keyframes. This is also where you can create new animations or go through the multiple ones created. Keep in mind that in order to have access to the animation, the ***Action Editor*** must be selected. This option is right next to the *Dope Sheet* icon, in a dropdown menu.
* ***Timeline***: This is where the timeline and playback controls are found. In here, the ***Auto Keying*** is on, which means that every time a control is manipulated it automatically creates a keyframe. You can always disable that function by clicking on the dot next to the playback controls.

With this workspace, you have everything needed to start animating!

![](/files/Xa0BAUhmYgT0Tq74MSvT)

These are the bottom windows. The top one is in the ***Graph Editor,*** the middle one in the ***Dope Sheet,*** and the bottom one is the ***Timeline.*** The top red arrow shows the ***Only Show Selected*** tool and the bottom one shows the ***Auto Keying***.

{% hint style="info" %}
**💡 Hint!**

Since Blender is highly customizable, this is also a good time to set up the layout that best suits you, adding, adjusting, or removing windows. Each animator has their own preferences, so feel free to edit the layout however you want!
{% endhint %}

## Getting Started

#### **Starting Pose**

In the rig file provided, there’s already an action, the ***Starting\_Pose***. Considering that all avatar actions start from the idle pose, **we really encourage starting your animation from that pose and also using it again in the last frame**. This will make for a better transition from Idle to Emote and a more fluid animation.

{% hint style="info" %}
**💡 Hint!**

If you want to do a loop animation, you don’t have to start the animation from the Starting Pose. Feel free to use the pose that makes more sense in your animation!\*\*
{% endhint %}

**Animation Area**

In the provided avatar file, you will find a collection called ***Animation\_Area\_Reference***. It consists of three objects that will visually help setting the animation limits: ***Animation\_Area\_Reference***, ***Ground\_Reference*** and ***Root\_Animation\_Area***.

* Animation\_Area\_Reference is a 4x4 cube, which is the bounding box. Avatar mesh and props should stay within this area through the whole animation. Props can be moved around freely as long as they stay within the cube area.
* Ground\_Reference is a plane provided to help checking if there’s ground penetration during the animation. It also contains important info: the smaller circle, which has a diameter of 2 meters, defines the area where the avatar root can be moved. That means that, while on the ground, the avatar can only move 1 meter in each direction: front, back, left and right.
* Root\_Animation\_Area is a cylinder that defines the area where you can move the avatar root/center of gravity (CTRL\_Avatar\_UpperBody or Avatar\_Hips). The cylinder is 4 meters high, which means the root can go all the way up as long as no mesh is outside of the bounding box. Avatar legs, arms and other body parts can be outside of the cylinder, as long as they are never outside of the Animation\_Area\_Reference.

![Animation area reference.](/files/plKvqoaknexgnqqU8F9X)

To summarize, avatar can move right, left, front amd back and long as the root stays within the cylinder, which means 1 meter in any of the four directions.

![Avatar movement.](/files/YFGmiGLaMfzaUZOJuyKa)

As for the height, it can go all the way up (max 4 meters) as long as the avatar stays within the bounding box. Below are some cases on avatar height done right (whole body within bounding box) and some done wrong (mesh outside of bounding box).

| ![](/files/LbMpzSdtIr6KzF9FmHoD) | ![](/files/XdBxlGWeFdI48zq8iEX5) |
| -------------------------------- | -------------------------------- |

| ![](/files/lVvZlzCOYHXZMWWZPxzx) | ![](/files/bkc6D7gHt9bbDVSTCn9U) |
| -------------------------------- | -------------------------------- |

![](/files/BBABuxE9SQfLNnmOwkZa)

Here are some examples of emotes that are within the animation area boundaries.

| ![](/files/D8YRS2FBImCmH4knTrqc) | ![](/files/Pezsfbpu1wLmpecsLOSZ) |
| -------------------------------- | -------------------------------- |

{% hint style="info" %}
**💡 Attention!**

Watch out for these boundaries because crossing them might cause gameplay issues.
{% endhint %}

## **Creating an Animation**

The blend file has an animation clip ready to be edited: *StartingPose\_Avatar*. You can duplicate and rename that animation clip as you see fit. There’s no need to create one from scratch!

On the *Browse Action* section, simply click on ***Create A New Action*** button to duplicate the current animation. To rename the clip, just click on the text and type something else.

Belnder 4.4 introduced *Slotted Actions*, the icon to the right of the *Browse Action* section from previous versions. There’s no need to mess with that if you’re creating an emote with no prop, so you can just leave it as it is. If you’re animating the avatar, make sure the slotted action is Avatar\_Animation.

![](/files/P5RPjjiTwyyUwqRyZ7D3)

Create a new animation by duplicating the existing one or by clicking on ***Unlink Action*** and then ***New***.

### **Browsing and Deleting Animations**

In Blender, you can have multiple animation tracks in the same file. It is possible to browse them by clicking on the Browse Action dropdown menu. All animation with and F (Fake User) will be saved. To delete an animation, press Shift on the keyboard and click on the X. After doing that, the animation will show a 0 next to it, which means that it will be deleted the next time you close Blender or re-open the file.

![](/files/Av0OdtSKSyKMDrSG1oUD)

Browsing animations: The ones with an F will be saved, and the ones with 0 will be deleted.

Another way of deleting animations without having to reload Blender is by changing the Display Mode from View Layer to Blender File. Expand Actions and delete any unwanted animation by right clicking on them and selecting Delete.

![](/files/D8427fdAWN33MZvk7klZ)

You can delete animations directly from Blender File under Display Mode in the outliner.

{% hint style="info" %}
**💡 Hint!**

Do not always edit the same animation track. Before making major changes, just duplicate the animation. That way you have a back up version in case you regret deleting or changing something. This is also a nice way to keep track of the progress made so far!
{% endhint %}

![](/files/kILBd5uBnec5tLlzqyyZ)

Duplicating animation clips.

### **Naming**

**An animation’s name should start with a capital letter and if the name is more than one word long, the words should be separated by \_.** Do not use spaces or special characters. Here are some examples of naming:

* Snowfall
* Rainbow\_Dance
* Throw\_Money
* Talk\_To\_Hand

### **Emote Overrides**

Emote overrides happen when deform bones don’t have a keyframe set in one of the parameters. Without a keyframe, that bone won’t have the information of where it should be, how much it has been rotated and scaled, leaving that channel open. The consequence is that if you play an emote in world and then trigger yours while the previous one was still playing, the information of location, rotation and scale will be overridden by the previous emote, which will cause a combination of them both. Unless this is done in purpose, it will affect your animation, sometimes with a fun result, but others with completely messed up the emote. Below is an example of an emote override.

![](/files/evEPWkpuzQUTIFeeL31e)

To avoid that, select all layers with bones in them (which can be found in ***Object Data Properties*** > ***Skeleton*** > ***Layers***). Then, in ***Pose Mode***, leave the timeline cursor in the first frame of your animation and, with your mouse in ***Viewport Display***, press ***A*** to select everything. In the ***Graph Editor***, click twice on the ***Eye*** icon next to the armature channel to make all channels visible. With all bones selected, press ***I*** to set a keyframe. Do the same for the last frame.

**Make sure to select the deform bones, this is especially important!** The deform bones can be found in the last bottom layer and are shown as green bones in the ***Viewport***.

![](/files/jWY3GYTgz0KpM9QPcJVI) Setting keyframes on all bones in the first and last frames prevents emote overrides.

## **The Animation Specifications**

### **The Animation Length**

The max length of an animation is **10 seconds** or **300 frames**. Remember to keyframe every control’s properties on the first and last frames.

{% hint style="warning" %}
⚠️ Channels with visibility turned off in the Graph Editor won’t be keyframed, deleted, or even shown in the Action Editor. Unless it was intentionally done that way, pay extra attention to the visibility.
{% endhint %}

![](/files/oHWS7gJTPQU72PCnM1uO)

Make channels visible before keyframing!

### **Number of Animations**

If it is a standard emote (with no prop), the exported file can only have one animation. For emotes 2.0 you can have one clip for the avatar and one clip for the prop. If animations were duplicated during the process, make sure you delete all of them before exporting. Keep only the final version. Sequence emotes that need many animations to work (action start, action loop, and action end) are not supported right now.

### **Format**

Animations should be exported as .**GLB**. The file can only contain the deforming skeleton and the animation. **Mesh, controls, and any other object should not be exported**. More details on how to export can be found [**below**](#exporting).

### **Sampling**

Since constraints can’t be exported, the only way to export the animation clip is by baking it, which means that all the deforming bones’ positions, rotation, and scale will be keyframed in every single frame of the animation. If the clip is too long, like up to 300 frames, it’ll have 300 keyframes after exporting and the more keyframes it has, the heavier the file gets.

Sampling is a good way to optimize the animation. The sampling rate will define how often a keyframe will be baked in the animation. For example, if the sampling rate is set to 2, that means a keyframe will be created at every two frames. A sampling rate of 3 will bake a keyframe every three frames and so on. The higher the sampling rate, the lighter the file.

The drawback, however, is that the animation will start getting less and less fluid since it loses some important keyframes (they are distributed through the animation in an uneven way). It’s also important to notice that **sampling is NOT dividing the number of the animation’s frames by the sampling rate**.

Usually, a **sampling rate of 2 or 3** will do the trick. Those numbers can optimize the animation without compromising the quality.

{% hint style="info" %}
**💡 Hint!**

If the number of frames of the animation can be divided by the sampling rate, that’s a good thing! It means that the final frame will be baked, preserving the transition from end to start of the animation.
{% endhint %}

### **File Size**

The max file size is **3 MB**. If the file is over that after exporting, try checking if the mesh wasn’t exported by accident or if the animation isn’t over 10 seconds. If it is still over 3 MB, try experimenting with the Sampling Rate, as higher values will improve the optimization.

If the emote contains any additional 3D models, the textures in these models can't exceed a size of 1024 pixels.

## **Exporting**

Since we only want the armature and the animation to be exported, turn off the mesh visibility and any object other than the armature before exporting, as shown below:

![](/files/NwIiBxgitft6DnynHpUY)

Turn off the mesh visibility before exporting!

To export, go to *File* > *Export* > *glTF2.0 (.glb, .gltf)*

![](/files/Sk2r7GKOJ5f4el6RVX7O)

For the export settings, expand Include and in Limit to toggle Visible Objects. Then, expand the Data tab, expand Armature and enable Export Deformation Bones Only.

| ![](/files/Ea9T7f1EgtwKyGtMvJCX) | ![](/files/Aw2g0U8NhuSjfVFOQd4k) |
| -------------------------------- | -------------------------------- |

If you need to sample the animation, expand the Animation tab, expand Sampling Animations and choose the number of samples wanted.

| ![](/files/ymtT9GdqfXJjjDWiP23d) | ![](/files/RLdkjlMowLzf7g0bvQPu) |
| -------------------------------- | -------------------------------- |

That’s it for exporting the animation!

## References

If you’re still not sure where to start or need some reference or inspiration, here are some animation clips to help you with that. These can be some nice studying material!

[Idle.glb](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/idle.glb)

[Jump.glb](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/jump.glb)

[Walk.glb](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/walk.glb)

[Run.glb](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/run.glb)

[Pose\_Jump.glb](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/pose_jump.glb)

[Pose\_Spin.glb](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/pose_spin.glb)

[Spotlight.glb](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/spotlight.glb)

[Fashionista.glb](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/fashionista.glb)

[Chic.glb](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/chic.glb)

[Flag\_Emote.glb](https://github.com/decentraland/docs/blob/main/images/emotes/Flag_Emote.glb)

[Flag\_Emote.blend](https://github.com/decentraland/docs/blob/main/images/emotes/Flag_Emote_Final.blend)


# Avatar Rig

Basics about the avatar rig.

A rig is a virtual skeleton that allows a model to move. It consists of a hierarchy of individual bones, much like a real life skeleton, and it works under a parent/child relationship. This document will cover some basic rigging concepts, such as bone position, bone orientation, deforming and non-deforming bones, the difference between IK and FK and their purposes. The structure of an avatar’s rig, custom attributes, and setup for animating can be found in [rig features](/creator/wearables-and-emotes/emotes/rig-features).

{% hint style="info" %}
**💡 Tip**: Install the [Decentraland Tools Blender plugin](https://extensions.blender.org/add-ons/decentraland-tools/). It includes several handy functions to help you edit and export 3D models, wearables, and emotes.
{% endhint %}

## **The Basics**

#### Bone Position or Pivot Points

Even though a rig is not an exact replica of the human skeleton, it is good practice to follow the position of real life bones when placing digital ones. This is done in order to guarantee believable and fluid deformation. Bone position is important because it sets the pivot point (where the movement will start from). A misplaced bone will cause bad deformation of the mesh. The images below show the difference in bone position.

![head\_pivot\_rig\_1.0.gif](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/head_pivot_rig_1.0.gif)

![head\_pivot\_rig\_2.0.gif](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/head_pivot_rig_2.0.gif)

#### Bone Orientation

The orientation of bones will define in which direction they’ll rotate, like positive X, negative Z, etc. They can be set up in many different ways as long as it’s consistent through the whole rig. For example, if the X axis is chosen for the bending forward motion of the spine, it makes sense that the same set up is used for the legs. The orientation is also important because it’ll affect mirroring behavior. That means that, usually, the right side orientation is the mirrored version of the left side’s and vice versa.

![](/files/4nPS25OTbdPhTosiMjsR)

*Turn on the axes to show bone orientation.*

![](/files/5U1Hc4lgsIFhtZZdwVGC)

*The axes are the directions in which the bone will rotate.*

#### Deforming and Non-deforming Bones

Deforming bones are the ones that will deform the mesh, they are responsible for the way the model moves. That’s the base skeleton and it **should not be edited at all**. Changing it in any way can break the rig and the animation won’t work when exported. For this reason, this base rig was moved to its own layer (the last one at the bottom). These bones are the armature that’s exported with the mesh.

Non-deforming bones are the ones that won’t deform the mesh, but they are still necessary in a robust rig and are used for the setup for [IKs, FKs](#what’s-FK-and-IK-in-a-rig) and other custom properties. Examples for non-deforming bones are controls, IK and FK bones, foot setup bones. These shouldn’t be exported, they are only used for animation purposes.

![](/files/cm7QeTDxgwrK5pe03OLU)

*Deforming bones.*

![](/files/7tEfRFtEoLmyRK3pFNER)

*Non-deforming bones.*

{% hint style="warning" %}
⚠️ **Attention!** **Do not edit the base skeleton at all!**
{% endhint %}

![](/files/6lXlMdmbiJfoaD2uzmzo)

*The base skeleton.*

#### Controls

As a good practice, a rig shouldn’t be animated by manipulating the deforming bones because it might cause the rig to break. Instead, **animations should be done by manipulating controls.**

Controls are basically non-deforming bones, which means they will not affect the mesh, making them completely safe to be manipulated and animated. Their function is to control the base skeleton through constraints and drivers, without directly touching it. They usually have different shapes and colors as a visual cue for their functions and purposes, making it easier for the animator to tell bones apart. Some of them will also have more than just location, rotation, and scale transforms because it’s possible to add custom properties to them, such as an IK/FK switch.

It’s also important to notice that it’s not possible to use the controls setup in a software different from the one it was originally done in. Each software has its own logic and it’s not possible to export constraints.

![](/files/jr6kUuYBnE81Bi1pCHrj) \_Controls and their different shapes and colors.\_

{% hint style="warning" %}
⚠️ **Warning**: The rig has to be animated in the same software it was created in. It's not possible to use a Blender setup in, for example, Maya and vice versa.
{% endhint %}

#### What’s FK and IK in a rig?

A rig can use two different setups that will influence how it moves: FK and IK.

#### FK - Forward Kinematics

In the forward kinematics, or FK, the parent in the hierarchy moves all the child bones under it. Let’s take the arm as an example: when the shoulder rotates, the rest of the arm will rotate as well; when the arm rotates, the forearm will follow its behavior. When animating in FK, each bone has to be rotated individually. This setup gives a lot of control over the movement and is great for arc motions, which are essential for a fluid animation.

*Direction of movement in the hierarchy.*

![](/files/WxYWev2twEF1sbVwAPhs)

*In FK, each bone has to be rotated individually.*

#### IK - Inverse Kinematics

In inverse kinematics, or IK, the child in the hierarchy can influence the movement of its parents. In this case, taking the arm as an example again, when the hand is moved around, the rest of the arm will follow the motion. It also means that no matter how the shoulder moves, the hand will maintain its position. In this setup, a pole vector/pole target will control in which direction the bones will bend. Legs are usually in IK and that’s essential for the feet to stick to ground level while animating.

![](/files/CwgwD9Q7sNL9vuGgejSn)

*Direction of movement in hierarchy.*

![](/files/6r0frR0x8KDAJp030Ztm)

*In IK, the hand will move all the arm and also maintain it’s position. The pole target drives the direction in which the elbow bends.*


# Particles in Emotes

How to export particles in your Emotes using Armature

Emotes 2.0 can have sounds and props, but did you know it’s also possible to use particles? They can be a lot of fun and add that extra visual spark to it! And they can speed up the animation process too.

{% hint style="info" %}
**💡 Tip**: Install the [Decentraland Tools Blender plugin](https://extensions.blender.org/add-ons/decentraland-tools/). It includes several handy functions to help you edit and export 3D models, wearables, and emotes.
{% endhint %}

But since object animation and particle systems are not supported in Emotes 2.0, we need to convert these particles into an armature (which is supported) in order to add them to emotes. We’ll be using a Blender add-on developed by the Foundation’s Content Team for this process, which can be downloaded from the link below.

Use the [Particles to Bones Addon for Blender](https://github.com/decentraland/docs/blob/main/creator/images/emotes/particle_system_to_bone_animation.py) to start!

![](/files/DCCiQuobv6RFE38spI2t) ![](/files/U5v5egNIJh42sx0CVJ1Y)

The process of adding particles to your emote will involve two steps, you can follow the guidelines along with these videos:

* **Converting particles to armature**

[![Video Preview](https://i.vimeocdn.com/video/1803452887-82f74713a8f16df8c3618654f539cfddf78cb1f9dfac951d99d340004ac26ad6-d_590x332)](https://vz-8a0704eb-552.b-cdn.net/bb51a195-4a80-48d3-badd-0bfe6cc9e3b3/playlist.m3u8)

* **Merging particles armature to prop armature**

[![Video Preview](https://i.vimeocdn.com/video/1803464351-0e8bf5158cb87707397a547948f99278b1af45d7669622887a43c3bd9340c064-d_590x332)](https://vz-8a0704eb-552.b-cdn.net/9f512c34-ae83-42fe-a858-165ccea6d0c5/playlist.m3u8)

{% hint style="info" %}
**Attention!**

⚠️ Creating a particles system won’t be covered in this documentation. The objective is to help implement it to your emote.
{% endhint %}

## Converting Particles Into Armature

Like previously mentioned, Emotes 2.0 do not support object anmation or any form of particle system. This is why we need to convert the particles into an armature.

To get started, you will need a working particle system and the add-on. The particle system shown below is a very simple one, it’s just an example to show how the add-on works. Make sure you particle system matches your emote animations for a better result.

![](/files/yz9EtKRGZVi9ZWgd7tqO)

*Simple particle system.*

Next, you download and install the add-on. To do so, go to Edit > Preferences > Add-ons and click on Install to browse the file in your computer.

![](/files/J65xNP265v03K20FQdV6)

*Click on Edit > Preferences.*

![](/files/k7StP452w89yIsy4Msky)

*Select Add-ons on the right and click on Install.*

Once that is done, click on the checkbox to enable it. A tab named Converter will show up on the right side of the Viewport.

![](/files/sXR3C9juyYDgy4Qdzu84)

*Click on the checkbox to enable the add-on.*

![](/files/xZPDSsh6T61hF8SXfGtm)

*You will find the Converter tab to the right of the Viewport.*

Next, select the object, go to the Converter tab, rename de Output Collection however you see fit, define Start and End Frames and click on Particle System to Armature Converter, as shown below.

![](/files/xp8spipAoK1jy7iHLFU0)

You will notice that a collection was created in the Outliner, with the particles armature. An animation clip was also created, by baking all the movement of each object.

![](/files/h8wVIXo4oYoceI283kzG)

*Armature generated by the add-on.*

![](/files/pznqEbUd8GCC0YCL4eMz)

*Animation lip generated by the add-on.*

And that’s it for converting your particles into an armature! Remember to save your file with a different name (keep the original as a backup), we will be needing it for the next step.

{% hint style="info" %}
**Attention!**

⚠️ Particles should be the last element added to your emote. When the emote is ready, you will have the exact length of the animation, which will make it easier to sync the particles to the action performed.
{% endhint %}

## Merging Particles Armature to Prop Armature

Emotes 2.0 can only have two armatures and two animation clips per file. If we just import the particles, we will end up with three armatures and three animation clips. The way to fix this is merging the particles armature into the prop armature. The reason to merge it to prop and not avatar armature is very simple: the avatar rig can’t be edited in any way by adding or deleting bones. This leaves prop armature as the only option.

## Merging Particles Armature to Prop Armature

Emotes 2.0 can only have two armatures and two animation clips per file. If we just import the particles, we will end up with three armatures and three animation clips. The way to fix this is merging the particles armature into the prop armature. The reason to merge it to prop and not avatar armature is very simple: the avatar rig can’t be edited in any way by adding or deleting bones. This leaves prop armature as the only option.

First thing we have to do is import or append the collection generated by the add-on. You could always export the glb file for it and import it into your emote file. Or you could simply append the collection, which is much easier and faster, by going to ***File*** > ***Append***, browse the particles file in your computer, select the folder ***Collection*** and choose the desired collection.

![](/files/h6s2kjqQWAgmNod3I5LU)

*To append a collection, go to File > Append.*

![](/files/VrFcevWNHSsWM0gVJ4KV)

*Once you browse the particles file, select the Collection folder.*

![](/files/kLsCUnzbjD99wuKICJy6)

*Choose the collection generated by the add-on (that you had the chance to rename). Particles\_Out is just how it was renamed for this example.*

Next, we are going to merge the armatures. In Object Mode, select first the particles armature, then hold Shift to select the prop armaure and press Ctrl+J to join/merge them, like shown below.

![](/files/qc4aP95kyxS1ufsDWXCI)

Once you do that, the particles might look messed up, but don’t worry, this is part of the process. To fix that, select each particle object on the Outliner one at a time, go into Object Properties (orange square icon) and under Relations, check if the parent is Armature\_Prop. Do this for all particle objects. This means that all objects are child of Armature\_Prop.

![](/files/mcztKbl4rh1BiuYUi8HS)

*Make sure Armature\_Pop is the parent for every particle object.*

After doing that for all the particle objects, select the first particle object in the Outliner, go into Modifiers (the blue wrench icon) and the field Object will be empty. Since this is the Modifiers tab, that means that in here you will choose which armature will drive the object. So just click on Object and select Armature\_Prop and repeat this for all the particle objects. As you do it, you will notice that the particles objects are going back to their original sizes, fixing all that mess created when the armatures were merged.

![](/files/mj3zCd7nof4Louv8iGDE)

*Select the proper armature to drive the objects.*

Now that the armature is properly merged and set up, there’s one last step for this to work. If you try to play the animation, you will notice that the particles are not moving. And that is because now they are part of Armature\_Prop, and the animation being played by it is the prop one. Remember that particles had their own animation clip? What we need to do now is copy the keyframes from particles animation clip and paste them in the prop animation clip.

To do so, go into ***Pose Mode*** and in the Outliner, expand ***Armature\_Prop*** and then ***Pose***. Select all the bones that belong to particles.

![](/files/zSoaYALq22uAk3VvVUTK)

*Selecting all particle bones.*

With the bones selected, in the Action Editor, select the original animation clip for particles that has all the keyframes. Select all keyframes by pressing A, right click and copy the keyframes. Then, select the prop animation, set a keyframe on the first frame and paste the keyframes from particles animation clip.

![](/files/cXj51mkUFFZ8IvJvWGGH)

*Copying frames from particles animation to prop animation.*

And you’re done! Save the file, make sure to delete the original particles animation clip and export as you usually would.

If you need more info on how to do it, check the ***Exporting*** section in the [Adding Props and Sounds to your Emotes](https://docs.decentraland.org/creator/emotes/props-and-sounds/) documentation.


# Props and Sounds

Guidelines to add props and sounds to the emotes.

In order to take your Decentraland Emotes to the next level you can add props (3d geometry) and/or sounds to them, doing the emotes much more fun and engaging! In this guideline you will find everything you need to know to export them correctly!

{% hint style="info" %}
**💡 Tip**: Install the [Decentraland Tools Blender plugin](https://extensions.blender.org/add-ons/decentraland-tools/). It includes several handy functions to help you edit and export 3D models, wearables, and emotes.
{% endhint %}

## **The Basics and Limitations**

To start adding the props to your emotes it's important to use the [Decentraland Template File](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/BaseMale_Rig_1.0.blend) which will have the rig for the avatar and also the Ground Reference to keep your work inside the allowed space boundaries.

**Currently, the props animations only work with Armature/Bones Animations meaning that \_transform animations**\_\*\* are not allowed.\*\*

The emote with their props must be exported all together in one single *.glb* file (Avatar\_Armature + Props\_Armature with its animations).

* No more than 3 MB in total.
* No more than 3k tris for props in total.
* No more than 2 materials and 2 textures for props.
* No more than 62 bones for the prop armature.
* The emote must have one animation for the avatar and one animation for the prop. *Currently multiple animations are not allowed.*
* Both animations (Avatar and Prop) must have the same keyframe length.
* Animations cannot exceed 300 frames or 10 seconds.
* Space boundaries are 4 square meters. Props and particles should stay within the reference cube provided in the Avatar File. For avatar movement, check [Ground Reference and Animation Area](/creator/wearables-and-emotes/emotes/creating-emotes#ground-reference-and-animation-area). section.

## **Naming Conventions:**

Naming conventions must be strictly followed for the emotes to work! Otherwise they will not play correctly neither in the builder nor in world.

#### Armatures Name Conventions:

**For Avatar:**

`Armature`

**For Props:**

`Armature_Prop`

#### Animations Name Conventions:

**For Avatar:**

`AnimationName_Avatar`

* Example: `TennisServe_Avatar`, `GunShoot_Avatar`

**For Props:**

`AnimationName_Prop`

* Example: `TennisServe_Prop`, `GunShoot_Prop`

## **Getting Started**

Before starting you animation, you will have to create a rig for the prop. If you’re not familiar with the process, check [Create a Rig](/creator/3d-modeling-and-animations/create-a-rig) for more information on how to do it.

Ensure that the prop object and armature have their origins located at the 0,0 location within Blender. Additionally, apply transformations to the prop object and armature, ensuring they are frozen at a scale of 1,1,1. This is crucial to prevent any potential issues with the prop's behavior when being utilized within the world or during animations.

#### Making the Prop Follow the Avatar Rig

Some props might have to be attached to certain body parts, like a tennis racket to the hand. That can be done by simply adding a constraint. To do so, in ***Pose Mode***, select the prop bone (the tennis racket one, for example), press ***CTRL + Shift + C*** on your keyborad and select ***Child of*** or just click on the ***Bone Constraint Properties*** tab and, in the drop down menu, select ***Child of***.

*Add a constraint by pressing `Ctrl + Shift + C` on your keyboard.*

Then, in ***Target***, select the avatar armature and in ***Bone*** select the bone you want the prop to follow. To maintain the prop’s original position, click on ***Set Inverse*** once you add the constraint. If the influence is 1, the prop will fully follow the selected bone, if it’s 0, the constraint will be disabled. You can set keyframes on the influence to turn it on and off throughout the animation. To do that, just press I while the cursor is on top of ***Influence***.

***Chlid of** constraint menu. Keyframe the influence to turn it on and off.*

{% hint style="info" %}
**💡Animation Tip!** If you use the slide to turn off the Influence, the prop will not maintain its previous position, making it hard to keep the animation fluid. To avoid having to manually fix the position, instead of using the slide, click on the X next to Influence, set a keyframe on it and another one on all the transform attributes. This way the prop will keep the same poistion as when the Influence was on!
{% endhint %}

{% hint style="info" %}
**💡Animation Tip**

Don’t leave the prop visible from the start! To avoid spoiling what’s about to happen and an abrupt transition, start the animation with the prop scaled down to 0.001 and only turn it to 1 when you want it to appear. Remember to scale back down to 0 by the end of the action. This will make the transitions much more fluid and cool!
{% endhint %}

### Animation Slots

Blender 4.4 introduced a new feature: animation slots. According to Blender documentation, “the purpose of slots is to allow an action to store distinct animation data for multiple data-blocks”. In a nutshell, slots make it possible to store the animation of multiple things in the same Action. How does it affect emotes 2.0?

Blender 4.4 new feature: animation slots.

Even though it’s possible to have both the avatar and prop sharing the same action clip, because of the naming convention and number of animation clips involved in Emotes 2.0, it won’t work. So the pipeline for this would be:

1. Create an animation clip for the avatar, or rename the one provided (***Starting\_Pose***). It already has an animation slot, but feel free to use it (***Avatar\_Animation***) or create a new one.
2. Rename the animation clip ***AnimationName\_Avatar***
3. Create an animation clip for the prop and rename it ***AnimationName\_Prop***
4. Click on ***New*** button to create an animation slot for it (it will receive an automatic name: ***Armature\_Prop***)
5. Animate as you would do in previous Blender versions.

Creating and action clip and a slot for the prop animation.

## **NLA Tracks**

In order for all the animations to be exported, the clips should be added to the NLA Tracks. Make sure there’s only one animation clip for the avatar and another one for the prop, **they must have the exact same number of frames.**

In ***Object Mode***, select the avatar armature, got to ***Pose Mode***, select the respective animation clip in the Browse Action menu, click on ***Action*** and then the ***Push Down*** option.

Then, change back to ***Object Mode***, select the prop armature, go to ***Pose mode***, select the respective animation clip in the Browse Action menu, click on ***Action*** and then the ***Push Down*** option.

Pushing actions down to the NLA tracks.

{% hint style="warning" %}
⚠️ Be careful when pushing actions down . Make sure you select the desired armature with the respective animation. Don’t just change the animation and push it down before selecting the other armature or else you will be assigning two actions to an armature and none to the other.
{% endhint %}

The NLA tracks should look like this: one animation for each armature.

{% hint style="info" %}
**🔥 Optimization Tip**

**Before this step make sure to do a backup of your project.**

If you have different objects for your props you can merge them together in one single mesh. You can do this by simply selecting the objects and pressing the shortcut ctrl + J.

This would help to reduce the draw calls in game making the emote more performant.

Keep in mind that this won’t work for particles, though.

*Select objects and press `Ctrl+J` to merge them together.*
{% endhint %}

## **Exporting**

Emotes 2.0 are exported the same way as common emotes. Make sure only the avatar armature, prop armature and prop meshes are visible and hide everything else.

Have only avatar armature, prop armature and prop mesh visible for exporting.

To export, go to File > Export > glTF2.0 (.glb, .gltf)

For the export settings, expand Include and in Limit to toggle Visible Objects. Then, expand the Data tab, expand Armature and enable Export Deformation Bones Only.

|   |   |
| - | - |

Hit Export and you are done!

## **Add Audio to the Emotes**

### Format and Limitations for Audio Clips

* The correct format to export sounds for your emotes are `.mp3` and `.ogg`.
* The audio clip must have the same duration as the emote.
* While there is no limitation for size in the audio, the emote with props and sounds cannot be bigger than 3mb.

{% hint style="info" %}
**📔 Note**: If the emote has sound (mp3 or ogg), it must be zipped with the .glb. After that, just drag and drop the .zip to the builder. More details can be found here: [Uploading emote with sound](/creator/wearables-and-emotes/manage-collections/uploading-emotes#uploading-emotes-using-a-zip-file)
{% endhint %}

{% hint style="info" %}
**💡 Attention!** Take into consideration that audio clips used in the emote must be original IP (Intellectual Property), having the rights for reproducing and follows the [Content Policy](https://decentraland.org/content/)criteria.
{% endhint %}

### Editing Sounds

To add sounds to your emotes you can do it in different ways:

1. **Edit your sounds directly on Blender**

One way to add sounds to your emotes is using the video sequencer editor that Blender provides.

To start adding sounds go to *Editor Type> Video Sequencer.*

Drag and Drop you sounds to the channels interface.

Press the shortcut `N` to see more options to handle your sounds like displaying waveform, make your sounds Mono or changing the volume.

{% hint style="info" %}
If you want to fade in and out you can simply do it by adding keyframes from 0 to 1 and viceversa to the volume property.
{% endhint %}

Once you finished to edit your sounds you can export it going to *Render> Render Audio*. In the exporting option you need to select `.mp3` or `.ogg` format in the *Container* section and then *Mixdown*. **Only the audio within the frame range will be exported.**

2. **Render animation and add sound with a sound edit software**

While editing sounds directly in Blender can be convenient, it is not very flexible because the software is not primarily focused on sound editing. The available tools are very basic. If you want to add a more professional touch to your sounds, we recommend using dedicated sound editing software of your choice.

There are several software options you can use, such as [Audacity](https://www.audacityteam.org/) (Free and OpenSource), Adobe Audition, Ableton Live, or ProTools. Using dedicated sound editing software will provide you with a wider range of tools, functionalities, and sound effects, allowing you to enhance your sounds and give them a more professional feel.

To render your emote you can simply add a camera to your Blender scene and position it in a way you can see all the elements as clearly as possible to later have a good reference to add sounds.

When rendering an emote, it is important to only include the frame range of your emote and not more. Choose an aspect ratio that suits your needs and select the output folder where you want the video or image sequence to be saved.

{% hint style="info" %}
**Hint!**

*Before rendering make sure you do a low sampling rendering to save time in your render!*
{% endhint %}

Once this step is completed, use your video as a reference to create the corresponding sounds using your preferred sound editing software. **Ensure that the video sequence matches the animation's framerate of 30 frames per second (fps)**


# Rig Features

Features about the avatar rig and downloadable file.

This documentation explains the set up for Rig 1.0, its controls, and features.

{% hint style="info" %}
**💡 Tip**: Install the [Decentraland Tools Blender plugin](https://extensions.blender.org/add-ons/decentraland-tools/). It includes several handy functions to help you edit and export 3D models, wearables, and emotes.
{% endhint %}

### Armature Transforms

These are the armature’s transforms in Object Mode with the controls’ setup. **Do not edit this in any way**. The rig should only be manipulated in Pose Mode. To avoid unwanted editing, the transforms have been locked in Object Mode.

*Rig 1.0 transforms.*

{% hint style="warning" %}
⚠️ **Warning**: **Never edit the rig in Object Mode.**
{% endhint %}

## Bone Orientation

This is the bone orientation for Rig 1.0. As it is right now, it’s not possible to mirror behavior on the shoulders, arms, hands, or fingers.

*Axes for bone orientation.*

*Behavior when mirrorring poses.*

### Bone Collections

To avoid any accidents and to make it easier to identify the controls, this rig is organized in bone collections that can be accessed in the *Data Properties* tab in Blender. These collections’ visibility can be toggled on and off by clicking on the *Eye Icon.* By default, they are all visible, except for the DON'T TOUCH ones.

Armature Data Properties tab.

This is how the bones were separated into the collections:

* Global/Switch: global controls, such as the root and spine ones, as well as shoulders. Controls with any custom attributes are also in this collection.
* FK Upper: all upper body FK setup controls.
* FK Lower: all lower body FK setup controls.
* IK Upper: all upper body IK setup controls.
* IK Lower: all lower body IK setup controls.
* Fingers: controls for both hands’ fingers.
* Deformation Bones: this is where the deformation bones are stored.

{% hint style="warning" %}
**⚠️ Attention!**

The DON'T TOUCH collections hold the set ups for IK and other rig constraints and should remain hidden. Editing these bones could break the functionality of the rig.
{% endhint %}

## Controls and Grouping

Controls are non-deforming bones that drive the base skeleton. They have different colors depending on their category:

* Yellow: global controls and controls with custom attributes
* Green: hip (easier to identify in the spine hierarchy)
* Blue: controls with FK behavior
* Red: IK controls
* Pink: left side controls
* Orange: right side controls

*All the controls and their colors.*

## Custom Attributes and Setup

### FK/IK Blend

Even though arms are usually set as FK and legs as IK, there are certain situations that will require a different setup. If the hand has to maintain a certain position, like during push ups or while climbing, the IK will be the best choice. As for the legs, while in the air, swimming or rolling, FK works best. For more flexibility and freedom in animation, this rig has an FK/IK blend in the UpperBody control, being 0 completely FK and 1 completely IK. Any other value in-between will be a blend of the two.

![FK/IK blend for both arms and legs.](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/ik_fk_rig_1.0.png)

*FK/IK blend for both arms and legs.*

![How the FK > IK Switch works.](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/IK_FK_rig_1.0.gif)

*How the FK > IK Switch works.*

### Isolate Rotation FK Blend

Another custom attribute in the UpperBody control is the isolate rotation, that allows you to choose if the bone will inherit its parent’s rotation or not (while in FK). While at 0, the bone won’t inherit the rotation, while at 1 it will completely follow the parent’s behavior. Any other value in between will be a blend of the two. This is an interesting tool because it causes the FK bone to maintain its position, behaving a little like an IK.

![Isolate rotation attribute for arms.](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/IsoRot_rig_1.0.png)

*Isolate rotation attribute for arms.*

![How the IsoRot attribute for the arms works.](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/IsoRot_Arms_rig_1.0.gif)

*How the IsoRot attribute for the arms works.*

The Head control also has this attribute. It’s really helpful for walk cycles, for example, since the head will keep its rotation even though the torso is twisting, making sure it’s always looking forward. Without this option, the animator would have to manually rotate the head every time the torso twists in order for it to be straight and look forward.

![Isolate rotation attribute for the head.](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/IsoRot_Head_rig_1.0.png)

*Isolate rotation attribute for the head.*

![How the IsoRot attribute for the head works.](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/IsoRot_Head_rig_1.0.gif)

*How the IsoRot attribute for the head works.*

{% hint style="warning" %}
⚠️ **Warning**: In older Blender versions, even if all controls have been selected and key framed, these custom attributes won't be automatically key framed. Make sure to manually insert a keyframe in each attribute so you don't lose the pose/motion you created. In Blender 4.4, by pressing I, a keyframe is set on all attributes and custom properties.
{% endhint %}

![In previous versions of Blender, make sure to keyframe all the controls and custom attributes!](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/custom_attributes.gif)

*In previous versions of Blender, make sure to keyframe all the controls and custom attributes!*

*In Blender 4.4, press I to automatically set a keyframe on Location, Rotation, Scale & Custom Properties..*

Another solution for keyframing custom properties is selecting ***Keying*** under on the Timeline tab and on ***Active Keying Set*** select Location, Rotation, Scale & Custom Properties, like shown on the gif below. That way, everytime you press I, a keyframe will be created without the pop-up menu. Since some animators prefer the menu, by default, that option is not enabled. But feel free to choose the method that suits you best.

![Keyframing with the Keying option.](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/keyframe_custom_properties.gif)

*Keyframing with the Keying option.*

### Reverse IK Foot Setup

Animating an FK foot is pretty straightforward: just grab any of the controls and rotate it. Since there’s a control for the foot and another for the toes, the animator has full control over the movements. However, for the IK it’s not so simple. The foot has to stick to the ground, while also being able to rotate on the ball and heels and side to side.

This rig was set up in a way to give the animator freedom of foot movement without losing the advantages of the IK system. It consists of four controls:

* Foot roll: this control rotates the foot back and forth and side to side. To avoid bending too much on the heel or too much on the ball, a limit was set so the foot rig doesn’t break. When it reaches this limit, the foot will stop rotating.

![Foot roll: rotate in X and it moves back and forth; rotate in Z it moves side to side.](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/foot_roll.gif)

*Foot roll: rotate in X and it moves back and forth; rotate in Z it moves side to side.*

* Toe tip roll: rotates the foot from the tip of the toes. It only rotates forward.

![The toe tip roll only rotates in positive X.](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/toe_tip.gif)

*The toe tip roll only rotates in positive X.*

* Toes control: rotates the toes from the ball.

![Toes can be rotated in any direction.](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/toes.gif)

*Toes can be rotated in any direction.*

* Foot control: this is a global control that moves the foot as a whole. Since it’s the parent of all the other foot controls, it’ll keep any transforms while also being able to be grabbed and rotated.

![How the foot control works.](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/foot.gif)

*How the foot control works.*

### Locked Transforms

Some controls may have a lock symbol next to the transforms parameters, which means that those values can’t be changed. This was done to controls that should only behave in a certain way and to avoid any unwanted transformation. For example, elbows and knees are meant to rotate on just one axis, which in this case is X, and so the other axes have been locked. Other examples of controls with locked attributes are IK elbows and knees, fingers, foot roll, and toe tip.

It is advised to keep these locked, but in case you want more freedom of movement, just click on the lock icon to unlock it.

![Locked transforms in a control.](https://raw.githubusercontent.com/decentraland/documentation-creators/main/images/emotes/locked_transform.png)


# Manage Collections

Manage your wearables and emotes collections


# Creating a Collection

Guidelines to Create a Decentraland Collection

![](/files/xlqlTH5dSY9Yuq5JJTu0)

## What is the Wearables Editor?

The Wearables Editor is a tool within Decentraland’s Builder that allows you to upload, add metadata to, and publish your own custom wearables.

> Remember: these docs don’t explain how to create the models, meshes, and textures that make up wearables, they just explain how to use the Wearables Editor to upload and publish your wearables. For an intro on the actual wearable creation process, start here.

### **Logging in**

To start uploading and publishing your wearables, navigate to [**builder.decentraland.org**](https://builder.decentraland.org/).

Click **Sign in**, and then **Connect** to log in with your Metamask or Fortmatic wallet. After signing in, click the **Collections** tab.

## Creating a Collection

Before you can upload a wearable or an emote, you must create a collection first. To do that, go to <https://builder.decentraland.org/> and click on ***Collections***. If you don’t have any collections yet, click on the ***New Collection*** button, the one with an image of a folder. If you already have another collection, clikc on the ***+*** button and select ***New Collection***.

![](/files/Kklu0vZ80AM6l9dQ0Ep1) ![](/files/apQ4qx1rVF48IfZSIadd)

After clicking on the button, you will be asked to rename your collection, as shown bellow. In case you change your mind, you can edit the name of your collection at any point **before publishing**.

![](/files/jTcbVcdwC3hTG7kFjWHf)

Now, you’re ready to add items to it. For that, just click on the button Add Item and just drag and drop the file with your wearable/emote or browse your computer.

![](/files/TYUHzinNcrYyYliX3bCc)

Once you click on ***Add Item***, you will get a window like the one shown below. Just drag and drop the file with your wearable/emote or browse your computer.

![](/files/D6Pv4JVu1Qrth5QILY8N)

If you already have a collection and want to add more items to it, just click on Add Item and upload your file. You can add as many files as you want before publishing the collection.

![](/files/RWUpz0jV9DFMiXe6joyD)

*Remember: you cannot add, remove, or change the rarity of items after the collection is pubilshed.*

Each item of the collection have:

* **Name of the item:** this name will be displayed when distributing your wearable or emote on the marketplace.
* **Description:** *(optional)* a brief statement describing your item, this is displayed when distributing your wearable or emote on the marketplace.
* **Category:** - the category that your wearable belongs (upper-body, eyewear, skin, etc)
* **Rarity:** - the rarity determines the maximum number of NFTs you will be able to mint of your wearable or emote after publication. This is the only property that cannot be modified after publishing a collection.
* **Tags:** *(optional)* descriptive words that users can use when searching or filtering for items. These are relevant to competitions or events!

### **Rarity**

The rarity of your item determines the total number of NFTs that can be minted. Rarity is the same for both emotes and wearables and you will be able to define it once you upload your file.

| Rarity    | Number of Items |
| --------- | --------------- |
| Unique    | 1               |
| Mythic    | 10              |
| Exotic    | 50              |
| Legendary | 100             |
| Epic      | 1,000           |
| Rare      | 5,000           |
| Uncommon  | 10,000          |
| Common    | 100,000         |

#### Attention!

{% hint style="warning" %}
⚠️ **The name of your collection, as well as the number of items and their rarity can't be changed once it's published!**
{% endhint %}


# Uploading Wearables

Guidelines to Upload Wearables to the Editor

Once you export your wearable, you’ll have to upload it to the builder. This document will cover the process of uploading wearables.

## Uploading Your File

Remember that you need to create a collection before you can upload your file. If you don’t know how to do that, check [Creating a Collection](https://docs.decentraland.org/creator/wearables-and-emotes/manage-collections/creating-a-collection). To upload your wearable, just drag and drop the file on the ***New Item*** window or browse your computer. It will automatically detect if the file is an emote or wearable. **Remember that the collection max file size is 3MB**.

![](/files/SPRA7JlYHZTS8r2EuZuI)

When you upload the file, you will be asked to select a body shape, enter a name and define the rarity and the category. You can also add the thumbnail for the wearable.

### **Body Shape**

To ensure that your wearables can be worn by the intended avatars, you need to upload separate GLB files for each body shape. If you have two separate versions of the wearable, one for male and one for female, you can add one of the representations during the upload process and then add the other later using the editor. If your wearable is meant to be unisex, make sure to upload a single GLB file that is designed to fit both male and female versions.

![](/files/8kBAky8LxLuDGhHGxBDw)

### **Rarity**

Select the Rarity of your item.

![](/files/ndVC8hCwbLU3XUEDlSaX)

| Rarity    | Number of Items |
| --------- | --------------- |
| Unique    | 1               |
| Mythic    | 10              |
| Exotic    | 50              |
| Legendary | 100             |
| Epic      | 1,000           |
| Rare      | 5,000           |
| Uncommon  | 10,000          |
| Common    | 100,000         |

### **Category**

Wearables are organized into different categories, depending on what part of an avatar they modify. Select the appropriate category for your item.

![](/files/XlcqEEZfCWQXvexqkZZB)

### **Custom Thumbnails**

You can add your own custom thumbnail by clicking on the camera icon and browsing your computer. **The thumbnail must be 256px square .png file with transparent background.** Collections containing thumbnails without transparent backgrounds will not be accepted by the Curation Committee.

![](/files/el1zC5fq35oGra1IUIgN)

{% hint style="warning" %}
⚠️ Having a good render of your wearable is crucial in making it more appealing to potential users in the marketplace. **It's important to avoid adding any graphics other than the wearable itself, because this may cause the curation committee to reject it.**

<img src="/files/QUaetqwbq7m78ZbNA74I" alt="" data-size="original">
{% endhint %}

### **Spring Bones**

If your wearable contains bones with `springbone` in their name, the Builder will automatically detect them and display a **Spring Bones** configuration panel. From this panel you can adjust physics parameters like stiffness, gravity, and drag for each spring bone chain. See [Spring Bones](https://docs.decentraland.org/creator/wearables-and-emotes/wearables/spring-bones) for details on how to set up spring bones in your model.

### **Properties**

Below the thumbnail you're going to find the properties of your wearable, number of triangles of your model, number of materials and textures.

![](/files/9xL9nKTHtWGV9RaIWM1U)

## **Uploading Mouth, Eyes and Eyebrows**

The mouth, eyes and eyebrows category have a different behaviour in the editor because these are just .png files. To upload these just drag and drop the png file as a transparent image (256X256 pixels). Mouth is going to be automatically tinted by skin color, same for the eyebrows tinted by the hair color.

{% hint style="warning" %}
If you want the asset to be masked, so a part of the mouth or eyebrows is not affected by the tinting, upload a zip file with both the png and the mask files. Remeber that the mask file should have a suffix "\\\_mask" in order to work.
{% endhint %}

![](/files/NQK3JF4VUeDec4HOao2z)

After that uploading your wearables you will end up with a screen like this, that shows the items in your collection.

![](/files/IZouadvZfbPmtgJWVHKj)

## **Setting the Price of Your Wearables**

Once you publish your collection and it gets approved, you can then enable the sales on your collection.

![](/files/LZz8jOPB9BoSRLE7JXiy)

You can set the price of your wearable by clicking on ***Put up for sale***. This can all be edited anytime, so don’t worry if you want to change it later on. Prices are set in MANA. Remember that when you mint wearables, they are minted directly on Matic/Polygon. When a user purchases your item, the transaction will be conducted in Matic/Polygon MANA.

You could also ***Make it Free***, which means that the price will be set as 0 MANA and the beneficiary address will be null. Know that making it free (primary sale) does not prevent it from being sold at any price as a secondary sale.

Don’t forget to set the beneficiary address, which is the one that will receive the MANA from your sales. You can use any Ethereum address you like. To automatically fill in the address you are logged in with, click ***I’m the Beneficiary.***

![](/files/KLWzn0uNUUVWOQfT4QQb)

Put the item up for sale and you will be back to the list of wearables in your collection. When you click on the item, you will get its general info. Click on the button ***Preview*** to see it on the editor.

![](/files/9xVa5DBlq14V5Qg90Kc2)

## The Editor

Once you click on ***Preview***, you will have the editor open. You can edit all the info of your wearable, as well as add new ones, such as description, tags and overrides. This also where you add other body shape representation to your wearable.

![](/files/lIhADOhtFTtdlg2Xdakj)

## **Description**

This is a brief statement describing your item that will be displayed in the marketplace.

## **Overrides**

Overrides determine which Wearable categories or avatar body parts your item will hide. For instance, a hat with attached hair might need to hide the *Hair* category. A deep-sea diver helmet may require hiding head accessories like earrings, eyewear, tiaras, etc., which wouldn’t be visible. Multiple options can be selected for each override.

* **Base Body**: This refers to core avatar parts like the *head* and *hands*. For example, if you’re creating a **Handwear** item such as a robot mechanic hand, you’ll likely need to hide *hands* to prevent overlap and clipping.
* **Wearables**: This includes other Wearable categories. You can hide multiple categories. For more details on each category and how items interact, refer to [**Creating Wearables**](https://docs.decentraland.org/creator/wearables/creating-wearables/).

{% hint style="warning" %}
Note: The overrides you select will be the suggested default settings for your Wearable. However, users can customize which Wearables are hidden or showing from the Backpack.
{% endhint %}

## **Tags**

Tags are simply descriptive words that users can use when searching or filtering for items. These are relevant to competitions or events!

## **VRM Export Permission**

When this property is enabled, it will allow owners of your item to include it in VRM Avatar Exports so they can show it off outside of Decentraland.

## **Outline**

The Outline toggle controls whether your wearable is compatible with Decentraland's outline rendering system (used in Medium/High quality settings). By default, this is enabled for all new wearables.

You should disable this option if your wearable:

* Has manually created outlines in the model
* Uses inverted normals
* Shows visual artifacts when the outline effect is applied

Most wearables work fine with the default setting (enabled). Only disable this if you notice outline-related visual issues with your wearable. Once you disable the outline, you will need to save the changes by clicking on ***Save***.

![](/files/w2subLNIxwD2Dm38wKhk)

## **Adding Another Representation**

If your wearable has a different representation for male and female you will need to upload another file. So far, you only have one uploaded. In the example, it was the female version of the Krampus Sweater. To add the other representation, click on the three dots (*…*) at the top right, next to ***Properties*** and select ***Add male/female*** representation. In the example below, we needed the male version.

![](/files/rgwMxOei5rbqJUeABSnD)

Once you click on it, you will get the Add Male/Female representation window, drag and drop the other representation file to upload it. Once uploaded, another window will show up the wearable and if everything is ok, just click on Save.

![](/files/5iGZhESvdoKKK7ConNRq) ![](/files/qWUnbkfNnrC1nVy6S3po)

## **Preview**

To preview your wearable, hover your mouse over the wearable icon on the top left and click on the eye symbol.

![](/files/iT15b9e5RGutl5ymbc2p)

By clicking on the icon at the lower left you will be able to edit the avatar. This is pretty useful if you have a male and female version of your wearable, so make sure to check how both versions look like in editor, testing different emotes to identify if there are any skinning issues and mixing other wearables to see how it matches with different clothes. When you’re done editing your wearable, click on ***Save***.

![](/files/61oE1iJL7CqeifjVKfJV)

## **Testing in World**

Even after testing the wearable in the editor, it’s important to check how it’s actually going to look like and behave in Decentraland. To test it in world, go to the Collections tab. Select the desired collection and click the button ***See in World***.

![](/files/qWhX85OcmU3gSxzwRUqR)

After clicking the following pop up is going to appear. Selecting ***Empty Parcels*** will teleport you to a place without too much content, which will load faster. Selecting ***Genesis Plaza*** will take you to the main plaza.

![](/files/mbVkYgfqDO19j00dZPos)

Once you select See in world, a new tab will open on your browser, and you will get this message.

![](/files/tYuuif7C2l3woGF9pVPP)

Click on ***TRUST PEER-TESTING.DECENTRALAND.ORG*** and a pop-up will show up. Simply click on Open Decentraland. To test your wearable, go to the backpack and equip it.

![](/files/JdfrSc0r359knVT7qDGZ)

## **Before Publishing**

Make sure to set the price properly, add a nice description and double check if all the information and settings are right. If you’ve filled all the information necessary you will see ***Done*** as the status of your item.


# Uploading Emotes

Guidelines to upload Emotes to the Editor

Once you export your emote, you’ll have to upload it to the builder. This document will cover the process of uploading emotes.

## **Uploading Your File**

Remember that you need to create a collection before you can upload your file. If you don’t know how to do that, check [Creating a Collection](https://docs.decentraland.org/creator/wearables-and-emotes/manage-collections/creating-a-collection). To upload your emote, just drag and drop the file on the ***New Item*** window or browse your computer. It will automatically detect if the file has any animation, identifying it as an emote.

![](/files/ujjmfjYXQTA62nwVD8FF)

Drag and drop your animation file to upload it.

You will be asked to enter a name for your emote, define its rarity, the category and the play mode. Below the thumbnail is shown the number of animation clips in your file, the length of the animation in seconds, the length in frames and the frame rate.

![](/files/s6ilslHKKMuUoEVFSoYh)

## **Uploading Emotes Using a .zip File**

If the emote has sound (*mp3* or *ogg*) it must be zipped with the `.glb`. After that, just drag and drop the `.zip` to the builder. Also, it is possible to add a `.json` file along with the other assets in the same `.zip` to add name, description, rarity, category, play mode and/or tags. These are the definitions for each:

* `name`: Name of the Emote
* `description`: Description of your Emote (no more than 64 characters in total, counting spaces)
* `category`: Category of the Emote ("dance", "stunt", "greetings", "fun", "poses", "reactions", "horror", "miscellaneous")
* `rarity`: Rarity of the Item ("unique", "mythic", "legendary", "epic", "rare", "exotic", "uncommon", "common")
* `play_mode`: Simple or Loop Animation ("simple", "loop")
* `tags`: Tags for easy finding in the marketplace.

To add those definitions to the emote just create a text file, naming it **emote.json** and add the following lines as the example:

```
{
  "name": "Tennis Shot",
  "description": "Show me you can do tennis",
  "category": "fun",
  "rarity":"epic",
  "play_mode": "simple",
  "tags":["tennis", "emote", "shot"]

}

```

This way the builder is going to take all the .json information and it automatically to the emote.

**Rarity**

Check the rarity chart in [here](https://docs.decentraland.org/creator/wearables-and-emotes/manage-collections/creating-a-collection#rarity).

## **Category**

Choose the category that best describe your emote.

* Dance
* Stunt
* Greetings
* Fun
* Poses
* Reactions
* Horror
* Miscellaneous

## **Play Mode**

There are currently two play modes:

* ***Play Once***: means that your emote will only play once. After that the avatar will return to *Idle* position.
* ***Loop***: the emote will keep playing in loop until the user input another action.

## **Custom Thumbnails**

For emotes, you don’t have to upload any images since the editor already has a built in tool to create a thumbnail. Just select the frame that best represents the action.

People should be able to identify what the animation is about through the thumbnail. If a front shot isn’t good enough, try rotating the model, zoom in or out, pan up or down, pick any frame from your clip. It’s really important that you select the best shot!

![](/files/yc24GYj7MdSrNtDXVBrk)

Rotate, zoom in or out, pan up and down. Use the tools to get the best shot of your animation!

## The Editor

Once you set the thumbnail, you will have the editor open. This is where you can check if the animation is playing well since a 3D avatar will be performing it.

![](/files/ugacNK9eRKKzfL0XRDgk)

By clicking on the icon at the lower left you will be able to edit the avatar. Click on the cilinder icon on the lower right to check if you animation is staying within the boundaries of height and space.

![](/files/fWOqxi4aZVpybEln8LAC)

The icon at the botton left allows you to edit the avatar.

![](/files/oY1EuhTGi9QLuPbSwqUE)

Cylinder icon shows the boundaries for the animation.

You can also edit the emote’s name, thumbnail, category, rarity and play mode, as well as add a description of the animation and add tags to it. Click on ***Save*** when you are done.

* **Description:** This is a brief statement describing your item that will be displayed in the marketplace.
* **Utility** Describe the in-world utility of the Wearable or Emote.
* **Tags:** Tags are simply descriptive words that users can use when searching or filtering for items. These are relevant to competitions or events!

![](/files/Sbqp0PEpkLBPLm4b1PAf)

## Testing in World

Even after testing the animation in the editor, it’s important to check how it’s actually going to look like and behave in Decentraland. To test it in world, go to the Collections tab, select the desired collection and it will show all the items you have in it. Click on See in Decentraland.

\
\\

![](/files/dXBXzpCJyRRCa8hS1rmz)

\
\\

{% hint style="info" %}
You will be asked to choose if you want to test it in an Empty Parcel or in Genesis Plaza. Selecting Empty Parcels will teleport you to a place without too much content, which will load faster. Selecting Genesis Plaza will take you to the main plaza.
{% endhint %}

\
\\

![](/files/ELpuZSF5jODG67eSgnyq)

\
\\

{% hint style="info" %}
After choosing, a new tab will be open in your browser with a message informing you that you are about to use a custom Catalyst. Click on TRUST PEER-TESTING.DECENTRALAND.ORG to continue.
{% endhint %}

\
\\

![](/files/7KjG3q2xGQjldqTa4ARg)

\
\\

{% hint style="info" %}
After that, you will get a pop-up asking to open the Decentraland Explorer. Once the explorer is running, click on Jump Into Decentraland.
{% endhint %}

\
\\

![](/files/c2r4kgcp7LpUCVrEl8OD)

\
\\

{% hint style="info" %}
Once in world, press I to open the backpack and, in the emotes tab, select the emote to test.
{% endhint %}

\
\\

![](/files/J55eTdhgZBVmeoCpveSX)

\
\\

## **Before Publishing**

Make sure to add a nice description and verify if all the information and settings are right. Double check the thumbnail too. If you’ve filled all the information necessary you will see Ready to Submit as the status of your item. Now your emote is ready to be published!

![](/files/8krJi56lQuLRIamjfjjQ)

The Ready to Submit status means that your file is ready be published!


# Uploading Smart Wearables

Guidelines to Upload Smart Wearables to the Editor

After generating your Smart Wearable using the [SDK7](https://github.com/decentraland/docs-creator/blob/main/creator/development-guide/sdk7/smart-wearables/README.md), the next step is to upload it to the builder. This document explains how to upload, publish, and put your Smart Wearables up for sale.

## Uploading Your File

Remember that you need to create a collection before uploading your file. If you don’t know how to do that, check [Creating a Collection](https://github.com/decentraland/docs-creator/blob/main/wearables-and-emotes/manage-collections/creator/wearables-and-emotes/manage-collections/creating-collection/README.md). To upload your Smart Wearable, drag and drop the file on the ***New Item*** window or browse your computer. It will automatically detect if the file is a Smart Wearable. **Remember that the collection max file size is 3MB**.

![](/files/IvMQXApxExg3Nh6hAUuZ)

When you upload the file, you will be asked to upload a video showcase.

## Uploading Your Video Showcase

This video showcase will be displayed in the marketplace for buyers to see how the Smart Wearable works.

To upload your video showcase, drag and drop a **.mp4** video file on the ***Upload a video for your Smart Wearable*** window or browse your computer. **Remember that the video max file size is 4MB and max duration is 15 seconds**.

![](/files/G2PXMIe8bQZBoIPHcOLP)

When you upload the video showcase, you will be asked to enter a name and define the rarity and the category. You can also add a thumbnail for the Smart Wearable if you like.

### Rarity

Select the Rarity of your item.

![](/files/iEoyBc6qJMuNkS3Ajhya)

| Rarity    | Number of Items |
| --------- | --------------- |
| Unique    | 1               |
| Mythic    | 10              |
| Exotic    | 50              |
| Legendary | 100             |
| Epic      | 1,000           |
| Rare      | 5,000           |
| Uncommon  | 10,000          |
| Common    | 100,000         |

### Category

Wearables are organized into different categories, depending on what part of an avatar they modify. In this step, you must select the appropriate item category.

![](/files/kxlnRhJqKfE1kw4unXFU)

### Custom Thumbnails

You can add your thumbnail by clicking on the camera icon and selecting the image you want from your computer. **Please ensure that the thumbnail is in a 256px square .png file format, with a transparent background.** Please note that the Curation Committee will not approve collections that have thumbnails without transparent backgrounds.

![](/files/9FpPyfPlpKrXr6bM3uRc)

{% hint style="warning" %}
⚠️ Having a good render of your Wearable is crucial for making it more appealing to potential Marketplace users. **It's important to avoid adding graphics other than the wearable itself because this may cause the Curation Committee to reject it.**

<img src="/files/87uNIt5B59itGdR5cjAy" alt="" data-size="original">
{% endhint %}

### Update Video Showcase

To update your video showcase, simply click on the camera icon and browse for the video on your computer. **Keep in mind that the maximum allowed file size is 4MB and the duration should not exceed 15 seconds**.

![](/files/BT6QIR5gpbKF4Q8r39eX)

### Properties

Next to the thumbnail, you're going to find the properties of your wearable such as the number of triangles of your model, the number of materials, and the textures.

![](/files/RbylAyGjPZGwvamhdJGp)

## Uploading Mouth, Eyes and Eyebrows

The mouth, eyes and eyebrows category have a different behaviour in the editor because these are just .png files. To upload these just drag and drop the png file as a transparent image (256X256 pixels). Mouth is going to be automatically tinted by skin color, same for the eyebrows tinted by the hair color.

{% hint style="warning" %}
If you want the asset to be masked, so a part of the mouth or eyebrows is not affected by the tinting, upload a zip file with both the png and the mask files. Remeber that the mask file should have a suffix "\\\_mask" in order to work.
{% endhint %}

![](/files/mLv8HVGuo7u97Q1Mnho9)

After that uploading your Wearables you will end up with a screen like this, that shows the items in your collection.

![](/files/a1NEC64twnxZphZbxSkK)

## Setting the Price of Your Smart Wearable

You can set the price of your Wearable by clicking on ***Set Price***. This can all be edited anytime, so don’t worry if you want to change it later. Prices are set in MANA. Remember that when you mint Wearables, they are minted directly on Matic/Polygon. Indeed, when a user purchases your item, the transaction will be conducted in Matic/Polygon MANA.

You could also ***Make it Free***, meaning the price will be 0 MANA, and the beneficiary address will be null. Please note that offering a product for free as a primary sale does not prevent it from being sold at any price as a secondary sale.

Don’t forget to set the beneficiary address, which is the one that will receive the MANA from your sales. You can use any Ethereum address you like. To automatically fill in the address you are logged in with, click ***I’m the Beneficiary.***

![](/files/o7DpVrCTmYb6fZCKQXQm)

Save the price, and you will be back on the list of Wearables in your collection. When you click on the item, you will get its general info. Click on the button ***Preview in Editor*** to see it in the editor.

![](/files/v7QlimF7VqH8jVf1AEDJ)

## The Editor

Once you click on ***Preview in Editor***, you will have the editor open. You can edit your Smart Wearable info, including the description, tags and overrides.

![](/files/EcI8BuKiN0BoQfmRFOn7)

## Description

This is a brief statement describing your item that will be displayed in the marketplace.

## Overrides

Overrides determine which Wearable categories or avatar body parts your item will hide. For instance, a hat with attached hair might need to hide the *Hair* category. A deep-sea diver helmet may require hiding head accessories like earrings, eyewear, tiaras, etc., which wouldn’t be visible. Multiple options can be selected for each override.

* **Base Body**: This refers to core avatar parts like the *head* and *hands*. For example, if you’re creating a **Handwear** item such as a robot mechanic hand, you’ll likely need to hide *hands* to prevent overlap and clipping.
* **Wearables**: This includes other Wearable categories. You can hide multiple categories. Please take a look at [**Creating Wearables**](https://github.com/decentraland/docs-creator/blob/main/creator/wearables/creating-wearables/README.md) for more details on each category and how items interact.

{% hint style="warning" %}
Note: The overrides you select will be the suggested default settings for your Wearable. However, users can customize which Wearables are hidden or showing from the Backpack.
{% endhint %}

## Tags

Tags are descriptive words that users can utilize for competitions or events!

## Preview

To preview your Smart Wearable, hover your mouse over the wearable element on the top left and click on the eye symbol.

![](/files/K44zQUD8TyG85jlhOa4w)

By clicking on the icon at the lower left, you can edit the avatar. This is useful if you have a male and female version of your Wearable, so check how both versions look in the editor, testing different emotes to identify skinning issues and mixing other Wearables to see how it matches with other clothes. When you’re done editing your wearable, click on ***Save***.

![](/files/OoHKIGz6EK9Cx0B3lcHD)

## Testing in Decentraland

Even after testing the Smart Wearable in the editor, it’s important to check how it will look and behave in Decentraland. To try it there, go to the Collections tab. Select the desired collection and click the button ***See in Decentraland***.

![](/files/v4Ids9I5DMOZMc69CXOU)

After clicking the ***See in Decentraland*** button, the following pop-up is going to appear. Selecting ***Empty Parcels*** will teleport you to a place without too much content, which will load faster. Selecting ***Genesis Plaza*** will take you to the main plaza.

![](/files/ME2PdeDdcTdO8rlLD66G)

Once you select the location to teleport, a new tab will open on your browser and you will get this message.

![](/files/RyzW5jhNmAyFtn1IqEVT)

Click on ***Switch to Sepolia***, and a pop-up from your wallet asking you to switch the network will show up. Click on Switch Network, and the new tab will automatically refresh. To test your Smart Wearable, you can go to the backpack and select it.

{% hint style="warning" %}
If you haven't enabled the Ethereum testnet networks, you can follow this [Metamask Article](https://support.metamask.io/hc/en-us/articles/13946422437147-How-to-view-testnets-in-MetaMask).
{% endhint %}

![](/files/dJhtLX2tryT0JkVuFY23)

## Before Publishing

Make sure to set the price properly, add a nice description and double check if all the information and settings are right. If you’ve filled all the information necessary you will see ***Done*** as the status of your item.


# Publishing Collections


# Publishing Collections

A description of the publication and approval process for Decentraland wearables

For detailed instructions on how to submit your collections for approval before publication, see [how to create a collection](/creator/wearables-and-emotes/manage-collections/creating-a-collection). This document explains how the approval process works when publishing wearables and emotes, and what criteria is used by the Curation Committee when reviewing wearables. For detailed information on the Curation Committee, [start here](/creator/wearables-and-emotes/publishing-collections/curation-committee).

## **The Publication Process**

1. After clicking "Publish" on your completed proposal and pay the fees of the items, the collection will be submitted to the Curation Committee for approval. Collections pending approval will be flagged as "Under Review".
2. Any collections pending approval from the Curation Committee may not be minted until the approval process is completed.
3. Each time you publish a new collection, a post is automatically created on the [Decentraland Forum](https://forum.decentraland.org/), providing a list and overview of each item in the collection. This Forum post gives the community and the Curation Committee a space to share feedback or request any changes that you need to make before your collection can be approved.
4. If there are changes you need to make, the Curation Committee will notify you in the Forum thread of your collection.
5. You can make any necessary modifications and submit your collection for approval again. It is possible for collections to undergo multiple reviews and rejections before receiving final approval.
6. Once your collection has final approval, you will be notified in the Forum. You will also see a green visual indicator in the Wearable Editor next to the approved collection.
7. With a successful approval, you can begin minting items in your collection!

## **Publication Fees**

There is a required fee for publishing items. This fee was originally [voted in place by the Decentraland DAO](https://governance.decentraland.org/proposal/?id=50092c00-c315-11eb-ac84-1705d1ae4a66) to deter users from publishing an excessive number of wearables in an attempt to "spam" the wearables market.

On Sep 02, 2023 [a proposal](https://governance.decentraland.org/proposal/?id=98d74360-3eae-11ee-88e6-1fe6cb69ee51) set the publication fees to **100 USD per item, to be paid in Polygon MANA**.

{% hint style="warning" %}
**📔 Note**: You can move MANA between Ethereum and Polygon using the [Account dApp](https://account.decentraland.org).
{% endhint %}

For example, if you publish a collection with two items and the price of MANA at the time is 1.25 USD, you will have to pay a fee of 160 MANA (100 USD for each item divided by the price of MANA in USD) regardless of the rarity (or how many NFTs can be minted) of those items.

These fees are transferred to the curators committee and the Decentraland DAO, where they are used to help fund the growth of the platform through grants and other initiatives voted on by the greater Decentraland community.

{% hint style="warning" %}
**📔 Note**: Currently, due to the time and resources required to review each collection submitted, **the publication fee is non-refundable**. If your collection is rejected, you will not receive your MANA back. If your collection is not immediately approved, the Curation Committee will provide you with suggestions and feedback on how to improve it, but the final acceptance of your collection cannot be guaranteed.
{% endhint %}

## **Acceptance Criteria**

Following is an overview of the criteria used by the Curation Committee when determining a collection’s eligibility. Much of this criteria is based on Section 2 of Decentraland’s [Content Policy](https://decentraland.org/content/).

Specifically, wearables may not:

* Involve illegality, such as piracy, criminal activity, terrorism, or child pornography
* Infringe third party intellectual property rights
* Contain cruel or hateful imagery that could harm, harass, promote or condone violence against, or that is primarily intended to incite hatred of, animals, or individuals or groups based on race or ethnic origin, religion, nationality, disability, gender, age, veteran status, or sexual orientation/gender identity
* Contain content that is libelous, false, inaccurate, misleading, or invades another person's privacy
* Breach the Privacy Policy
* Contain any content that promotes or could be construed as primarily intending to evade the limitations described above

Please refer to the full Content Policy [here](https://decentraland.org/content/) for additional details and definitions. Any submissions that violate the above criteria will be rejected.

**In addition to the Content Policy, the committee may reject wearable submissions on the following technical conditions:**

> * It is important that wearables be "skin weighted" correctly so that the avatar animations can be rendered as expected. Wearables without correct skin weighting will be rejected.
> * Wearables must preserve avatar UV mapping to ensure that user-selected skin tones can be rendered as expected.
> * The dimensions of eyebrow, eye, and mouth textures should not exceed 256 by 256px, and the image must have transparent background.
> * In the case of hands category, the wearable cannot be an item attached to the hand (a sword, shield, etc). The category is meant by hand accesories like bracelets, watches, rings,etc. and in the case of replacing the hand completely it should follow a proper armature skinning for the hand bones.
> * Wearables with a disproportionate number of triangles, textures and materials may be rejected because can cause poor performance and a bad experience for players. Creators should not exceeding the limitation [guidelines](/creator/wearables-and-emotes/wearables/creating-wearables) when creating wearables.
> * Wearables may not contain duplicate items within a collection. (Each item within a collection must be unique.)
> * Wearables may not mimic or copy other wearables that have already been published.
> * For security reasons, any wearables that contain any kind of QR Code may be rejected.
> * Wearables that exceed the space restrictions.
> * Wearables with misleading categories may be rejected; for example, a hat that is categorized as a lower body item.
> * Wearables must follow the armature humanoid structure to ensure a good quality gameplay. In this sense, currently vehicles or pets are not allowed because these are not wearables by definition.
> * Emotes that exceed the time and space restrictions. For more info check the [emote guidelines](/creator/wearables-and-emotes/emotes/creating-emotes)
> * Curators from the curators committee can submit collections but not approve their own. In this case, another curator from the committee would needs to review in order and approve or reject.

## **Attributing Collaborators** [**#**](https://docs.decentraland.org/creator/wearables/wearables-editor-user-guide/#attributing-collaborators)

If you collaborated with other artists when creating your items, you can add attributions within the Wearables Editor. This can only be done after publishing a collection.

First, navigate to the [**Builder**](https://builder.decentraland.org/) and select the **Collections** tab. Select the collection containing the items you want to add attributions to, click the **…** icon next to the **Mint Items** button, and select **Collaborators**.

To add collaborators, simply enter their Ethereum address, and click **Add**. You can add as many collaborators as you want. To remove a collaborator, simply click **Remove** next to the collaborator’s address.

![](/files/Mi6jujG0jQaniH6wbrF7)

## **Selling Items**

After your items are published in a collection and approved by the Curation Committee, they can be sold to other users in the metaverse.

Items can be sold in **primary sales** and **secondary sales**.

* **Primary sales** are performed by the Decentraland Store’s smart contract. During a primary sale, the **item is minted automatically**, and it is sold for the price set by you in the Wearable Editor.
* **Secondary sales** are performed by the Decentraland Marketplace’s smart contract. These occur anytime a user sells an item in the Marketplace **after it has been minted** or **purchased in a primary sale**. Items can be sold for any price in a secondary sale.

To view items available to purchase in a primary and secondary sales, head to the [**Decentraland Marketplace!**](https://market.decentraland.org/)

## **Primary Sales**

Primary sales occur when one of your items is purchased for the first time. These sales are only performed by the Decentraland Store’s smart contract.

When a user makes a primary purchase of one of your items, the store **mints the item automatically**, transfers the item to the purchaser, and sends the MANA proceeds to the beneficiary address.

> Remember! You do not need to mint your items in order to sell them in primary sales!

To sell your items via primary sales, begin by navigating to the [**Builder**](https://builder.decentraland.org/) and follow the next steps:

To enable Primary Sales, go to the **Collections** tab, select the one you want to enable and click the ***Enable sales*** button, after that click **Enable Sales** in the confirmation window that appears.

![](/files/iqj3hnTEzOhA9cne3Kfp)

Now you need to set the price and put each of your items for sale by clicking their **Put up for sale** button and set the price you want it to have. **When this is done, your item will be available to purchase within the Decentraland** [**Marketplace**](https://market.decentraland.org/)**.**

![](/files/KXK1p6qryOUpMVYEwBBF)

If the collection sales are enabled and the items price set, the Decentraland [Marketplace](https://market.decentraland.org/) will automatically mint one of your items whenever a user makes a primary purchase. This allows you to mint and sell all of your available items until the maximum supply is reached. If you want to save one or more of your items before listing them for sale, you need to manually mint an item to one of your own wallet addresses.

Any purchaser of one of your items is able to resell it at any time and at any price in Decentraland's [Marketplace](https://market.decentraland.org/).

**All Primary Sales in the Decentraland in-world store are subject to a 2.5% fee, which is transferred to the Decentraland DAO.**

If you sell an item through a primary sale, you will receive your MANA on Polygon. The proceeds of any items sold on Polygon will reside on the sidechain. If you want to transfer your MANA from the Polygon sidechain to the main Ethereum chain, you will have to pay a transaction fee. You can do so from the [Accounts](https://account.decentraland.org/) page. For more information on the Polygon sidechain, see [this blog post](https://decentraland.org/blog/announcements/polygon-mana/).

### **Disabling Primary Sales**

To unlist your items, click the **Remove from sale** button from the items you want to remove. This will only apply to primary sales for your items.

## **Secondary Sales**

Items can be sold in secondary sales at any time, and for any price, in the Decentraland Marketplace only after:

* They have been **minted**
* They have been **purchased in a Primary Sale**

In other words, anybody who owns an NFT for a wearable can sell it in the Decentraland Marketplace. There are royalties for wearables sold in secondary sales in Decentraland. Royalties goes to the item beneficiary.

## **Minting Wearables**

Minting is the process of creating the actual non-fungible tokens (NFTs) based on the items you’ve uploaded to the Wearables Editor.

All wearables in Decentraland are minted on the Polygon sidechain. This allows users to mint and transfer items without paying any gas fees (so long as these transactions are conducted solely on the Polygon sidechain).

As with selling items in primary sales, you will not be able to mint any items within a collection until the review process is complete. If your collection is still under review, you will see the tag **"Under Review"** appended to your collection. After it has been reviewed and approved, the tag will change to **"Published"**, and you can begin minting your items manually.

### **How To Manually Mint Items**

To mint published items, open the collection containing the items you’d like to mint, and click **Mint Items**.

![](/files/w5Zp4m7rxBf6D4s60NoU)

You will be shown a modal window containing a list of the items available along with the supply available for each. Remember, the supply is the total number of items you can mint. For example, if your supply reads 0/10, then you have used 0 out of your total supply of 10.

![](/files/s5XwsHGDxeQFOREMMKdK)

When minting, you must set the address that will receive the minted items and you must set the number of items you want to mint to that address. You cannot mint more items than are available in the supply available.

If you enter your own address, then the items that are minted will be transferred to your account.

You can “gift” items to anyone you like by entering their address instead of your own under Address.

Remember, these items are minted and transferred to the address entered for free. The price you set for items is only collected in primary sales.

{% hint style="warning" %}
⚠️ Note: You can currently only mint 50 items per transaction.
{% endhint %}

Are there any fees associated with minting items? No, items are minted on the Matic sidechain, thus removing any fees traditionally associated with minting NFTs on the main Ethereum blockchain.

### **Adding Minters to the Collection**

To add minters, simply enter their Ethereum address, and click **Add**. You can add as many minters as you want. To remove a minter, simply click **Remove** next to the minter’s address.

![](/files/Xk8FcdWzU4dhVVd55DYu)

### **Collection Ownership Transfer**

In order to transfer the ownership of a Collection, you will need:

* The wallet address used to create the Collection
* The new wallet address you will transfer it to
* The contract of the collection

{% hint style="warning" %}
⚠️ Note: This applies only to Polygon Wearables.
{% endhint %}

Copy your collection address in the builder

![](/files/zRavdaM22QxyPeOPxyym)

Use this URL - `https://polygonscan.com/address/collection_address#writeContract` and replace `collection_address` with the collection contract.

1. Connect you wallet with the `connect to web3` button

![](/files/pluC43N3GXq2k0YxSSGm)

2. Look for the contract method 23. `transferCreatorship`. Add in the input `_newCreator` the wallet for the new creator and click on `write` to send the transaction.

![](/files/WOV3cwuJCiXXIBwKqw1z)


# Curation Committee

A description and discussion of the Wearables Curation Committee

The Curation Committee is a group of individuals elected by the DAO who are responsible for reviewing and approving wearables and emotes submitted by the Decentraland community. The current Curation Committee includes three members, but it can be expanded to include more. Each member holds a key in a multisig wallet that is used to vote on the approval or rejection of each item submitted via the Wearables Editor.

The approval criteria used by the committee when reviewing wearables is outlined in [Publishing Wearables](/creator/wearables-and-emotes/publishing-collections/publishing-collections), the criteria for publishing emotes is outlined in [Emotes overview](https://github.com/decentraland/docs/blob/main/creator/wearables-and-emotes/emotes/README.md)

The current members of this committee are:

* Shibu, Art Director, Decentraland Foundation
* Juan Pablo Colasso, 3D Visual Artist
* Sebastian Valla, Art Director at Wonderzone
* Laura Uson Dolsac, Lead Artist at Polygonal Mind
* Malloy, Art Director at Feeka Cafe
* Hirotokai, 3D Artist and DCL Wearable Designer
* Sango, 3D Artist and wearable creator from Metazoo
* Grimey, 3D Artist and wearable creator from StudioSparkles
* AndreusAs, 3D Artist and independent wearable creator
* Mitch Todd, Digital designer and independent wearable creator
* Kristian, 3D Artist and wearable creator from Dappcraft
* James Guard, 3D Artist and independent wearable creator
* Fabeeo Breen, 3D Artist and Independent wearable creator
* Yannakis, 3D Artist and Independent wearable creator

## Why Does Decentraland Need a Curation Committee?

Wearables, emotes and other assets are a critical aspect of the avatar creation and customization experience. With the addition of the Editor, any member of the community can create their own wearables and emotes to share with other users.

However, wearables and emotes in Decentraland still need to be moderated in order to prevent spam, abuse, duplicated content, and copyright infringements (as per Decentraland’s [Content Policy](https://decentraland.org/content), [Terms of Use](https://decentraland.org/terms), and [Code of Ethics](https://decentraland.org/ethics)).

Wearables within the Decentraland ecosystem must also meet several technical requirements, otherwise they may not render correctly or they may adversely affect other wearables equipped at the same time. Until this approval process can be more fully automated, it is necessary for several individuals to review each wearable manually. Emotes also have to be approved by the Committee.


# Get started

Get started with the Decentraland Scene Editor


# Editing Scenes

The scene Editor is a simple visual tool that lets you create and publish Decentraland scenes.

The Creator Hub includes a powerful Scene Editor that combines a simple no-code interface with the ability to write code to customize your scenes further.

![Creator Hub](/files/iqQl7Qi9pTf4AxnBxjmf)

See [Creator Hub Installation](/creator/scene-editor/get-started/editor-installation) to get started.

{% embed url="<https://www.youtube.com/watch?v=52LiG-4VI9c>" %}

## Create a scene

To create a new scene, open the Creator Hub, go into the **Scenes** section, and click on the **New Scene** card.

![](/files/Sp7N7I2AtgQjMQPXoJz0)

You can then select what template to use as a starting point. You can pick an **Empty Scene** or a project with some initial content.

Then you'll be asked to name your scene, and choose a location to save it.

See [Manage scenes](/creator/scene-editor/get-started/manage-scenes) for more details.

## Moving around

To find your way around the Scene Editor:

* Use **W** and **S** to move close or far. You can also use the mouse scroll wheel, or **+** and **-** keys
* Use **A** and **D** to move sideways.
* Use **Q** and **E** to move up and down.
* Use the **Left Mouse Button** to click and select items and to move them around.
* Use the **Right Mouse Button** and drag to rotate the camera.

{% hint style="info" %}
**💡 Tip**: You can also rotate the camera by pressing **Alt** on Windows, or **Option** on Mac while dragging. This is especially handy when using a trackpad instead of a mouse.
{% endhint %}

* Press **Space bar** to reset the camera back to the default position

## Add items

Navigate the themed asset pack categories on the menu on the bottom to find different items that you can place on your scene.

![](/files/1zhrDPWV481ohN7N8wFG)

To place an item, click and drag it in from the asset pack menu into a location on your scene in the canvas.

![](/files/CZGOdOO0A4nIOcx5Ojze)

Click and drag a selected item to move it freely around the scene at ground level. See [Scene editor essentials](/creator/scene-editor/get-started/scene-editor-essentials#position-items) for more details.

{% hint style="info" %}
**💡 Tip**: Some items are **Smart items**, these come with built-in interactive behaviors. See [Smart items](/creator/scene-editor/interactivity/smart-items) for more details.
{% endhint %}

![](/files/2VeM7aYXByVIXH7sQeVr)

## Preview

To test your scene and experience it like a player, click the *Preview* button on the top-right corner. This will open a new window with the Decentraland Desktop Explorer, running just your scene. There you can move around the scene and interact with interactive items.

{% hint style="warning" %}
**📔 Note**: If you don't have it installed on your machine, download the **Decentraland Launcher** from [Decentraland.org](https://decentraland.org).
{% endhint %}

![](/files/kFXFURDUtsBJrB1sRPNv)

Configure different preview options from the dropdown menu next to the **Preview** button. See [Preview your scene](/creator/scenes-sdk7/getting-started/preview-scene) for a full list of all available options.

## Scene renderer

The Scene Editor uses **Babylon** as its default renderer for the editing canvas. You can switch to the **Bevy** renderer, which is available as an experimental preview.

To change the renderer:

1. Open the Creator Hub **Settings** (gear icon).
2. Go to the **Editor** tab.
3. Enable **Experimental features**.
4. In the **Scene renderer** dropdown, select **Bevy (preview)**.

The Bevy renderer is an alternative engine for the editing canvas. It affects how your scene looks while editing, not how it looks to players after publishing.

{% hint style="warning" %}
**Note:** The Bevy renderer is experimental and may not support all editing features that the default Babylon renderer does.
{% endhint %}

## Scene settings

Click the **Pencil icon** on the top-right of the screen. This opens a series of scene-level properties to edit, including name, thumbnail, scene size, and more.

![](/files/VvT6JowMryTc0ZoPnP5v)

See [Scene Settings](/creator/scene-editor/configure/scene-settings) for more details.

## Publish your scene

Once you're happy with your scene, press the **Publish** button.

![](/files/hpD6e4FEnJNaSxr9dt9Q)

See [Publish scene](/creator/scene-editor/publish/publish-scene) for more details.

## See also

* See [Scene Editor Essentials](/creator/scene-editor/get-started/scene-editor-essentials) for more details about the Scene Editor's interface.
* See [Smart items](/creator/scene-editor/interactivity/smart-items) for how to add simple interactivity to your scene.
* See [Combine with code](/creator/scene-editor/extend-with-code/overview) for how to edit the code of your scene.
* See [Publish scene](/creator/scene-editor/publish/publish-scene) for how to publish your scene to Decentraland.


# Creator Hub Installation

How to install the scene editor.

![Creator Hub](/files/iqQl7Qi9pTf4AxnBxjmf)

Download the Creator Hub [HERE](https://decentraland.org/download/creator-hub).

## Updating the Creator Hub

The Creator Hub application checks for updates every time you open it, and self-updates if there's a new version available.

You can also check for updates manually by clicking on the **Check for updates** button in the **Settings** menu. For this,

1. Open the wheel icon in the top-right of the screen <img src="/files/3COKGqUQ6IYNMJjFbpA8" alt="Settings" data-size="line">
2. Click **Check for updates**

## Editing code

If you also plan on reading and editing code in your scene, you'll also need to install either:

* <img src="/files/jIlOtBcgbGW7g62EK2XS" alt="VS Code" data-size="line"> [Visual Studio Code](https://code.visualstudio.com/): This is the recommended option for experienced developers.
* <img src="/files/h9LKmSXj7ZZZQjtEeiIB" alt="Cursor" data-size="line"> [Cursor AI](https://www.cursor.com/): This is a powerful code editor that is integrated with AI. It lets you pick different AI models to help you write code; a free tier is available, and more advanced models require a paid plan. This is a good option for developers who are new to Decentraland or TypeScript, or if you want to save time writing code.

You may need to select your Code Editor in the settings of the Creator Hub. To do this,

1. Open the wheel icon in the top-right of the screen <img src="/files/3COKGqUQ6IYNMJjFbpA8" alt="Settings" data-size="line">
2. Under **Code editor of choice**, select your Code Editor. You may find your editor listed in the dropdown, or you may need to select **Choose from your device...** to find it.

### AI skills

If you plan to use an AI agent to help you write code, we recommend installing the Decentraland SDK skills. These are ready-made instruction sets that teach your AI agent how to work with the Decentraland SDK, so it makes fewer mistakes and gives better results from the very first prompt. To install all of them, run the following command in your scene project's folder:

```bash
npx skills add decentraland/sdk-skills --all
```

See [Vibe coding](/creator/scenes-sdk7/getting-started/vibe-coding) for more details on installing specific skills and how to use them.

## Troubleshooting

If you run into issues, see the [troubleshooting](/creator/scenes-sdk7/debugging/troubleshooting) section.


# Manage scenes

Managing your scene projects

Each of your available scenes is shown as a card. Open the card to edit that scene, from there you can preview it or publish it too.

## Create a scene

Click on the **+** card, or on the **Templates** button, to create a new scene. You'll then be asked to choose a template, there are a few options, including an **Empty Scene**.

Then you'll be asked to name your scene, and choose a location to save it.

Once you confirm these steps, the scene project will be created. This may take a minute or two, as it downloads dependencies and sets up a folder on your local machine with everything it needs. When done, your scene will be opened in the [Scene Editor](/creator/scene-editor/get-started/scene-editor-essentials).

Click the three dots on an already created scene's card and click **Duplicate** to make a copy of an existing scene.

To rename your scene's display name, open it and click the pencil icon to change the **Name** field and other properties.

To rename the scene's folder on disk, click the three dots on the scene's card and select **Rename Folder**. Enter the new folder name and confirm. The folder name must be valid for your operating system and must not collide with an existing folder in the same location.

## Import a scene

The scene manager displays the scenes it finds in the default path on your machine.

To add a scene that is elsewhere on your local disk, click **Import scene** and find the path to the project folder. The imported scene will now be available as a new card in the scene manager screen.

The imported scene does not get moved in your local disk.

{% hint style="warning" %}
**📔 Note**: Do not manually rename or move the folder of an imported scene directly from your file manager. The Scene Editor will no longer be able to find the imported scene in its new path.
{% endhint %}

Scenes you created on the older web editor are stored in the cloud. To work on these scenes from the desktop Scene Editor, you must export the scene from the Web Editor, unzip it into a folder, and then import it on the desktop Scene Editor. See [Migrate from Web Editor](/creator/scene-editor/get-started/migrate-from-web) for more details.

## Delete a scene

In the scene selector screen, press the *three dots* icon and select *Delete from My Scenes*.

This removes the scene from your Scene Editor home screen. By default it doesn't delete the files from your machine, but the confirmation dialog includes a checkbox to **also delete the scene's files from your computer**.

By default, projects created via the Scene Editor are kept inside a `Scenes` folder in the Creator Hub's application data directory. You can change this location from the app's **Settings**, and you can navigate to a project's folder by clicking the three dots on its card and selecting **Open Folder Location**.

## Managing Worlds

If you own a Decentraland NAME or ENS domain, you can publish scenes to your [Decentraland World](/creator/scenes-sdk7/publishing/publishing-options#decentraland-worlds). Worlds appear in the Scene Editor just like regular scenes, and you can publish to them using the same **Publish** button.

### Visualizing storage space

Scenes published to Worlds count against a storage budget that is shared across all the Worlds owned by your wallet. The budget is calculated from your holdings: each Decentraland NAME or LAND parcel you own grants 100 MB, and every 2,000 MANA held in your wallet grants an additional 100 MB.

You can check your used and remaining storage budget in two places:

* The **Manage** section of the Creator Hub shows how much of your total budget is used and your total storage capacity. Click **View Details** for a breakdown of how your MANA, LAND, and NAME holdings add up.

<img src="/files/ZFskR76QGjfb3dFEd656" alt="" width="300">

* The **Worlds** tab of the [Builder](https://decentraland.org/builder/worlds).

### Undeploying scenes

If you need to free up storage space, you can undeploy scenes from the World Content Server. This can be done through the Builder interface, which allows you to easily undeploy scenes to release storage space.

For Decentraland NAME holders, if you exceed your allocated storage space (for instance, through asset sales or transfers to another wallet), you will be provided with a 48-hour window to address the situation. Failure to do so will result in your Worlds becoming inaccessible after this grace period.

To regain access to a blocked World, you can either:

* Acquire more MANA, Decentraland NAMEs, or LANDS to increase your storage capacity
* Undeploy existing scenes from the World Content Server to free up storage space

See [Worlds size limits](/creator/scenes-sdk7/kinds-of-projects/kinds-of-project#size-limits) for detailed information on how storage capacity is calculated.


# Migrate into Creator Hub

Migrate your scene from the Web Editor to the Creator Hub.

If you have a scene created with other tools than the Creator Hub, you can easily migrate it to the Creator Hub.

The Creator Hub is the recommended tool for creating Decentraland scenes. It has a much more polished interface than the Web Editor and allows you to combine the easy drag-and-drop interface with the ability to customize further with code. It also allows you to run your scene preview using the latest desktop client.

## Migrate from Web Editor

To edit the code in a scene created with the Web Editor, you must export the scene to your machine and open it with the Creator Hub.

{% hint style="warning" %}
**📔 Note**: If you don't have the Creator Hub installed, follow the steps in the following page before your start.

[Install Creator Hub](/creator/scene-editor/get-started/editor-installation)
{% endhint %}

1. Click the **Download icon** on the top menu of the Web Editor while editing the scene.

![](/files/JIJWuPdvJyaDaFOlDXGU)

2. This will download a *.zip* file, extract it.
3. Open the **Creator Hub**, go into the **Scenes** section.
4. Click the **Import Scene** button and select the path to your exported project folder.

![](/files/wYS2iR5zmd2yQ5Tccmbm)

Once you're done, you can keep working on your project inside the Creator Hub, with a visual interface that looks a lot like the Web Editor, but much more polished.

You can also edit the files under the `/src` folder to add behavior with code to your scene. See [Combine with code](/creator/scene-editor/extend-with-code/overview) for how to edit the code of your scene.

## Migrate a code-only project

You can import any code-only project into the Creator Hub. To do this,

1. Open the Creator Hub, go into the **Scenes** section.
2. Click the **Import Scene** button and select the path to your exported project folder.

![](/files/wYS2iR5zmd2yQ5Tccmbm)

Once done, you can start working on your project inside the Creator Hub, this doesn't prevent you from still using your favorite code editor to edit the code of your scene, or use the command line to run or deploy your scene.

After importing your project, any content that is created via code will not be visible or editable on the Creator Hub canvas, which can make it challenging to place and align new items. You will initially see your scene as an empty grid.

![](/files/EjVelr94BIH7kpQwFrHS)

Instead of manually adding your content to the canvas from scratch, you can run a command to automatically add it for you. To do this, make sure you have the latest version of the SDK installed and run the following command in your terminal:

```
npx sdk-commands code-to-composite
```

{% hint style="danger" %}
**❗Warning**: Make sure you have a backup of your project before running this command.

This command will overwrite the `main.composite` file with the new snapshot. It will also comment out all the code in the `.ts` files in the `src` folder. You will need to uncomment the code to make it run again.
{% endhint %}

This command runs your scene and takes a snapshot of the content that is created via code on the first frame. This snapshot is saved in the `main.composite` file, which the Creator Hub uses to display the content of your scene. The code in your scene is commented out, to avoid having duplicates of all entities.

Note that this command only captures entities and the components that can be represented on the Creator Hub UI. It does not replicate custom components, or reproduce code that carries out logic, or UI elements that are created via code. To add back any behavior that was commented out, you will need to edit the code in the `.ts` files in the `src` folder and uncomment the lines you need.

You may also want to rewrite part of the code so that instead of creating new entities, it references existing entities by name or by tags to give them behavior. See [Combine with code](/creator/scene-editor/extend-with-code/overview) for how to fetch these entities from your code.


# Scene Editor Essentials

How to use the Scene Editor

The Scene Editor's UI is divided into a few different sections, with different purposes.

![](/files/1pSOFJRjiDzv29vEJmy3)

* **Canvas**: Manipulate items directly and see what your scene looks like.
* **Entity tree**: Contains a list of all items in the scene and their hierarchy.
* **Properties**: Displays details about the currently selected item.
* **Resources**: Shows resources that are available to use.

## Moving around

To find your way around the Scene Editor:

* Use **W** and **S** to move close or far. You can also use the mouse scroll wheel, or **+** and **-** keys
* Use **A** and **D** to move sideways.
* Use **Q** and **E** to move up and down.
* Click the **Right Mouse Button** and drag to rotate the camera.
* Press **Space bar** to reset the camera back to the default position
* Use **Left Mouse Button** to click and select items and to move them around.

## Preview on mobile

The dropdown next to the **Preview** button has a **Show QR Code for Mobile** option. Scan the QR code with a phone on the same Wi-Fi network to open your scene in the [Decentraland mobile app](https://github.com/decentraland/docs/tree/main/creator/sdk7/building-for-mobile/README.md). This is the recommended way to validate UI, controls, and performance for mobile players. See [Preview on mobile](https://github.com/decentraland/docs/tree/main/creator/sdk7/building-for-mobile/preview-on-mobile.md) for the full guide.

## Set the Ground

The scene's ground can use various different textures. You can find these in the different themed asset packs in the item menu.

Items of type **Ground** have a paint bucket icon on them. If you drag one of these into your scene, it covers all of your scene's ground with copies of this item.

![](/files/Jnt8UTD2pKU4SS7BOzjc)

You can also add a single copy of the item by holding **Shift** while you drag the ground onto the scene.

![](/files/tstkc45A1TXYAEPHWhzD)

The collection of ground items appear in the [entity tree](#the-entity-tree) inside a folder. Each one of them is locked, to prevent accidentally selecting. [Untoggle](#lock-or-hide-items) the items to move or edit them.

## Add items

Navigate the themed asset pack categories on the menu on the bottom to find different items that you can place on your scene.

![](/files/1zhrDPWV481ohN7N8wFG)

You can also use the search box. Note that when you're inside an asset pack, the search only looks in that asset pack.

To place an item, click and drag it in from the asset pack menu into a location on your scene in the canvas.

![](/files/CZGOdOO0A4nIOcx5Ojze)

{% hint style="info" %}
**💡 Tip**: Your changes are saved automatically whenever you add, move, or edit properties of any of the items in your scene.
{% endhint %}

To duplicate an item, select it and hit **Ctrl + C** and then **Ctrl + V**. You can also find the item on the [entity tree](#the-entity-tree) to right-click and select the option **Duplicate**. The new item will be perfectly overlapping the original.

To delete an item from the scene, select it press the *Delete* key.

See [Import items](/creator/scene-editor/build/import-items) for adding your own custom 3D models from disk.

{% hint style="warning" %}
**📔 Note**: Once you dragged a 3D model into your scene, it's downloaded into your project folder and remains there even if you delete it. These unused models can increase the size of your scene.

Open the **Local Assets** tab to delete any unused models.
{% endhint %}

## Position items

{% embed url="<https://www.youtube.com/watch?v=cNl02PFPdcQ>" %}

Click with the **Left Mouse Button** and drag a selected item to move it freely around the scene at ground level.

You can also use the tools on the top menu:

![](/files/13p2BXdKPZmf8r78WRRn)

* **Move tool**: Click and drag each arrow to move the item in a single axis at a time. With this tool you can also position things above the ground level.
* **Rotate tool**: Click and drag each of the hoops around the item to rotate the item on one axis at a time.
* **Scale tool**: Click on the center of the gizmo and drag in or out to enlarge. This tool also lets you stretch an item in a single axis to change its proportions, to do this click on one of the axis of the gizmo and drag.

![](/files/meVz4XKzUMqrASwLlitE)

To have greater precision while moving, rotating or scaling an item, press and hold the *Shift* key while making adjustments. This will avoid snapping to the grid.

To change the movement granularity and other settings, click the downward arrow on the right of the tools. The following settings are available:

* **Snap**: Toggle the grid on or off. When off, the behavior of **Shift** is inverted: you don't follow the grid by default, you do if you hold **Shift**.
  * **Position**: The size of movement increments in meters when **Snap** is on.
  * **Rotation**: The size of rotation increments in degree when **Snap** is on.
  * **Scale**: The size of scale increments when **Snap** is on.
* **Align to world**: A single checkbox that refers to the axis used by the gizmos. When checked, the Move and Rotate tool axis always align with the world, and don't change with the object's orientation. When unchecked, they align with the object's orientation.

To select multiple items at the same time, press and hold the *Control* key while selecting them. You can then move, rotate, scale, duplicate or delete all of them in a single action.

## Smart items

Smart items are special items that come with built-in interactive behaviors. See [Smart items](/creator/scene-editor/interactivity/smart-items) for more details.

![](/files/2VeM7aYXByVIXH7sQeVr)

## The entity tree

On the left margin, you'll see a tree structure with all of the entities in the scene. This includes all of the items you add, as well as a few default entities.

{% hint style="info" %}
**💡 Tip**: Everything in a scene is an Entity, they are the basic building blocks of scenes. Items are Entities that have at least a position and a visible shape.
{% endhint %}

Instead of selecting an item by clicking on it from the 3D view of the scene, you can select it from the tree view. Click the right-mouse button on an entity to reveal more options: you can rename, delete, or duplicate, also create a child entity, or add a component to the entity.

### Searching the entity tree

A search box at the top of the entity tree lets you find entities by name. Type part of an entity's name and the tree filters to show only matching entities and their parent hierarchy, so you can see where each match sits in the tree. The search is case-insensitive. Parent entities of matches are automatically expanded so every result is visible.

Press **Escape** or click the clear icon to remove the filter and return to the full tree. If an entity is selected, clearing the search scrolls back to the selected entity so you don't lose your place.

\[Screenshot: entity tree with a search term entered, showing filtered results and expanded parent hierarchy]

### Entity hierarchy

Entities follow a hierarchy that can have as many levels as you want. Establish a parent-child relationship between two entities by dragging one item onto another on the tree. A child entity inherits the position of the parent, so when the parent moves, it carries any children with it. This can be practical while building a scene, for example you can set glasses and plates as children of a table, and then move the table without needing to readjust anything else. It can also be important when interacting with the scene, for items to move together.

![](/files/MkYUktFVONdITJMqox6l)

You can also minimize or expand the children of an entity to keep the view simple, this action has no effect on the scene.

### Special entities

The scene includes a couple of special entities that you can see in the entity tree.

* **Scene**: This refers to the root entity, everything you add in the scene is a child of this entity. You can open it to view [scene settings](#scene-settings).
* **Player**: The player's avatar. You can add special components to this entity that can change gameplay mechanics. You can also drag other entities to be children of the avatar. If an entity is a child of the avatar, its position will be fixed to the player. Use this for example to add a floating marker over the player's head, that follows the player around.
* **Camera**: The player's camera. You can drag other entities to be children of the camera. If an entity is a child of the camera, its position will be fixed on screen. Use this for example to display a gun in a shooter game, that is always in view even if the player points up or down.

### Lock or hide items

You might find it handy to sometimes lock an item, to prevent accidentally selecting and moving it. This is especially useful for background items, like the ground, or a building. To lock an item, look for it on the entity tree on the left, hover over it, and select the lock icon. You can toggle this behavior on and off via that same icon.

You might also want to hide an item that could obstruct your view while placing others. This is especially useful to hide the roof or a building, while working on the interiors. Hidden items are only hidden in the Scene Editor's canvas window, not to players entering the scene. To hide an item, look for it on the entity tree on the left, hover over it, and select the eye icon. You can toggle this behavior on and off via that same icon.

![](/files/pblsV3zsDlaPHdTqNsUX)

## Properties panel

Select an item by clicking on it on the canvas or the entity tree. You'll then see its components displayed on the properties panel, on the right of the screen. Different items have different components that each display specific settings.

![](/files/e6vnwozc1jKqQ5JJ1tHV)

Most non-interactive items have the following components:

* **Transform**: Sets position, rotation, and scale of the item.
* **GLTF**: What 3D model to load.

[Smart items](/creator/scene-editor/interactivity/smart-items) can include other components.

See [Components](/creator/scene-editor/build/components) to learn more.

## Scene limitations

Decentraland scenes need to follow certain limitations, to be able to run them one next to another. There is a maximum number of materials, textures, triangles, etc, that is proportional to the number of parcels in the scene. See [scene limitations](/creator/scenes-sdk7/optimizing/scene-limitations) for more details.

If the content in your scene exceeds any of these limits, the Scene Editor will notify this on the bottom-left corner.

![](/files/4OS3wfVYao5MqUNvalDL)

You can expand this menu to view details.

![](/files/byLpaC3KLb5UsJP4Gnpk)

{% hint style="info" %}
**💡 Tip**: If you're building a Decentraland World, you can always increase the [scene size](/creator/scene-editor/configure/scene-settings#layout) to increase your limits.
{% endhint %}

The content in a Decentraland scene must also avoid spilling onto neighbor parcels. If any part of the models in your scene extend beyond the limits, when you open the scene preview you will see these parts cut off. The Scene Editor will mark the entire model in red, but you should only really worry about the parts of the model that extend beyond the scene limits.

![](/files/bvtScE14XyHhWqnZAKuc)

{% hint style="info" %}
**💡 Tip**: If the models you want to display don't fit, you may want to increase the size of your scene. See [scene size](/creator/scene-editor/configure/scene-settings#layout) to enlarge your scene.
{% endhint %}

Even if the whole geometry of the 3D model fits in your scene, a model might be marked in red if the model's Bounding Box extends beyond the area. If this is the case, you can ignore the warnings, as the entire model will be displayed correctly. Learn more about [Bounding Boxes](/creator/3d-modeling-and-animations/meshes#bounding-boxes).

## Clean up assets

Keep your project tidy by removing assets that are no longer used. Open the **Local Assets** tab at the bottom of the screen and click the brush icon.

![](/files/ahmkHShQmLrsWV9Rig6R)

A dialog opens listing all assets in your scene and highlights those not referenced by any item.

![](/files/9Sy9fvzBwlSxDAJN8iJp)

Select the assets you want to delete using the checkboxes, then click **Remove Selected** to permanently remove them.

Deleting an item from the scene does not remove its files. Imported models, textures, or sounds remain in your project until you clean them up, so review unused assets periodically.

{% hint style="warning" %}
**Important:** If your scene contains code that references assets, some in-use assets may appear as unused. This dialog only detects assets referenced by components in the Creator Hub UI. After you click **Remove Selected**, the files are deleted from the project folder, this action is permanent and can't be undone.
{% endhint %}

## Scene settings

Click the **Pencil icon** on the top-right of the screen. This opens a series of scene-level properties to edit.

![](/files/VvT6JowMryTc0ZoPnP5v)

Here you can configure multiple properties including title and thumbnail, scene size, scene category and age rating, player spawn locations, and feature toggles.

See [Scene Settings](/creator/scene-editor/configure/scene-settings).

## See also

* See [Smart items](/creator/scene-editor/interactivity/smart-items) for how to add simple interactivity to your scene.
* See [Combine with code](/creator/scene-editor/extend-with-code/overview) for how to edit the code of your scene.
* See [Publish scene](/creator/scene-editor/publish/publish-scene) for how to publish your scene to Decentraland.


# Build

Build and customize your scene with visual tools


# Import custom assets

Import your own 3D models, images, sound, etc to use in your scenes.

You can import your own 3D models into the Scene Editor. Pick models from a wide selection of free or paid sources on the internet, or to create your own custom models. You can also import other assets like images, sound files, and videos.

{% embed url="<https://www.youtube.com/watch?v=UepXpH-k0EI>" %}

## Import an asset

To import a 3D model, an image, a sound file, or a video into your scene from your local disk:

1. Drag files directly onto the bottom panel. You can also click the **+ Import Assets** button on the top-left of the bottom panel and select from your local drive.

![](/files/KDDEkYrqI8LGICVRfX18)

2. Check the model thumbnail and click **Import**. When importing multiple assets, use the arrow buttons to cycle over each asset.

![](/files/aJOukXFxm8su5trfFCHZ)

You can now find your asset in the **Local Assets** tab. Assets are sorted into folders by type: 3D models appear under the *assets/Models* folder, images under *assets/Images*, sound files under *assets/Audio*, and videos under *assets/Video*.

Items from the built-in free asset packs are stored under *assets/asset-packs/*, and custom items created from the editor under *assets/custom/*. Older scenes may have user imports under *assets/scene/* instead. All of these paths work in your scene code, just reference whichever folder the asset is in.

* For 3D models, drag the `.glb` or `.gltf` files onto the canvas to add them as items on your scene.
* Other kinds of assets like images and sound files can be dragged onto the fields of an item. For example you can drag an `.mp3` file onto the *Path* field of an *Audio Source* component.

{% hint style="info" %}
**💡 Tip**: You can also paste files directly into the project folder. After doing this, press the **Refresh** button next to the **Import Assets** button to see the new files.

<img src="/files/WMFDQ60xZVHtY1tMxsVl" alt="" data-size="original">
{% endhint %}

### Supported formats

#### Audio

The following Audio formats are supported:

* *.mp3*
* *.wav*
* *.ogg*

#### Image

The following image formats are supported:

* *.png*
* *.jpg*
* *.jpeg*

#### Video

The following video formats are supported:

* *.mp4*

#### 3D Models

The following 3D model formats are supported:

* *.glTF*
* *.glb*

Both can include external texture image files, or external binary (*.bin*) files.

You can convert other formats into these formats with various different editors and tools. See [3D modeling](/creator/3d-modeling-and-animations/3d-models) for recommendations and tips.

All materials in the models need to be either *basic material* or *PBR*, and all textures need to be in sizes that are powers of two (ex: 256, 512). See [Scene limitations](/creator/scenes-sdk7/optimizing/scene-limitations) for details.

Each imported file, of any type, must occupy less than 50 MB to be usable in a scene. Larger files aren't supported.

**Free libraries for 3D models**

Instead of building your own 3D models, you can also download them from several free or paid libraries, or generate them with AI tools. See [Useful Resources](/creator/scenes-sdk7/getting-started/useful-resources) for a list of recommended asset libraries and generative AI tools.

{% hint style="warning" %}
**📔 Note**: Pay attention to the license restrictions that the content you download has.
{% endhint %}

Note that in several of these sites, you can choose what format to download the model in. Always choose *.glTF* or *.glb* format if available. If not available, you must convert them to *.glTF* or *.glb* before you can use them in a scene. For that, we recommend importing them into Blender and exporting them with one of the available *.glTF* export add-ons.

### Colliders

You might find that when running a preview the player can walk through your imported 3D models. This is likely because the models are missing a *collider mesh* to define a collision geometry. See [colliders](/creator/3d-modeling-and-animations/colliders) for more details and instructions.

{% hint style="info" %}
**💡 Tip**: Instead of editing the model to add a *collider mesh*, a simpler alternative is to add an *Invisible wall* smart item with approximately the same shape to stand in its place.
{% endhint %}

### Animations

If an imported model includes animations, the first animation that's packed into the model will be played in a loop.

Note that you don't have any control over when the animation starts or stops, or which one is played in case of several animations.

If there are multiple players in the scene, they may be seeing the animation out of sync from each other.

To change this behavior, you can include an **Animator** component. See [Make any item smart](/creator/scene-editor/interactivity/make-any-item-smart) for no-code tools to make your item interactive.


# Entities and Components

Understand how an item's components work

Select an item by clicking on it on the canvas or on the entity tree. You'll then see its components displayed on the properties panel, on the right of the screen. Different items have different components that each display specific settings.

![](/files/e6vnwozc1jKqQ5JJ1tHV)

Most non-interactive items have the following components:

* **Transform**: Sets the position, rotation, and scale of the item. If the item is a child of another item on the [Entity Tree](/creator/scene-editor/get-started/scene-editor-essentials#the-entity-tree), these values are relative to those of the parent's.
* **GLTF**: What 3D model to load. It includes the local path to the file for this 3D model. It also includes some properties for configuring [colliders](/creator/scenes-sdk7/3d-content-essentials/colliders#colliders-on-3d-models) on the model.

The items in your scene are all **Entities**. Everything in a scene is an Entity, they are the basic building blocks of scenes. Items are Entities that have at least a position and a visible shape.

## Add components

To add Components to any Entity, click the **+** sign at the top of the properties tab and select the Component from the list. See [Make any item smart](/creator/scene-editor/interactivity/make-any-item-smart)

![](/files/kQR7c8lHSxkJkqEZT6ij)

You can delete any Component from an Entity by clicking the three dots icon on its right, and selecting **Delete Component**.

## Create an entity from scratch

To create a fresh new Entity, right click on the root **Scene** Entity in the Entity tree, or on any other Entity, and select **Add Child**

![](/files/YIYdJzBQDim8OgiWsGs4)

This creates an empty Entity with just a **Transform** Component. The new entity is a child of the parent entity you clicked on. You can then add any other Components you want to it to shape it into anything you desire.

## Available components

The following Components can be added to any Entity via the Scene Editor UI:

* **Mesh Renderer**: Gives the Entity a visible shape based on a primitive shape (cube, plane, cylinder, or sphere).
* **Mesh Collider**: Gives the Entity an invisible collider geometry. This can block the player from walking through the item, and/or can make it clickable. See [collider](/creator/scenes-sdk7/3d-content-essentials/colliders).
* **Material**: Defines the color, texture, and other properties of an Entity that has a **Mesh Renderer** Component. See [materials](/creator/scenes-sdk7/3d-content-essentials/materials).

  <div data-gb-custom-block data-tag="hint" data-style="warning" class="hint hint-warning"><p>**📔 Note**: The item Must have a **Mesh Renderer** Component. It doesn't affect items with a **GLTF** visible shape.</p></div>
* **Visibility**: Defines if an Entity is invisible.
* **Light Source**: Adds a light to the Entity.
* **Swap Material**: Swaps the material of an Entity that has a **GLTF** component. If the 3D model has multiple meshes, you can swap the material of each mesh individually.
* **Audio Source**: Plays a sound from a sound file at the location of the Entity. See [Sounds](/creator/scenes-sdk7/3d-content-essentials/sounds).
* **Text Shape**: Displays text in the 3D space. See [Text](/creator/scenes-sdk7/3d-content-essentials/text).
* **Pointer Events**: Marks an Entity as clickable, displaying a hover-hint.

{% hint style="warning" %}
**📔 Note**: The **Pointer Events** Component only provides feedback. To perform actions when an Entity is interacted with, see [Make any item smart](/creator/scene-editor/interactivity/make-any-item-smart)
{% endhint %}

* **Multiplayer**: Shares any changes that happen to the Entity so that all players in the scene see it too. It can be configured to only share changes on certain components. See [Serverless Multiplayer](/creator/scenes-sdk7/networking/serverless-multiplayer#mark-an-entity-as-synced) for more details.
* **Animator**: Controls the playback of animations on an Entity with a **GLTF** 3D model. See [3D model animations](/creator/scenes-sdk7/3d-content-essentials/3d-model-animations).
* **Tween**: Makes the Entity gradually move, rotate, or scale over a period of time. See [Move entities](/creator/scenes-sdk7/3d-content-essentials/move-entities).
* **Billboard**: Makes the Entity always rotate to face the player. See [Face the user](/creator/scenes-sdk7/3d-content-essentials/entity-positioning#face-the-user).
* **Avatar Attach**: Attaches the Entity to the player's avatar, so it follows them around. See [Attach an entity to an avatar](/creator/scenes-sdk7/3d-content-essentials/entity-positioning#attach-an-entity-to-an-avatar).
* **Video Player**: Plays a video inside the scene, that can be displayed on the Entity via its **Material**. See [Video playing](/creator/scenes-sdk7/media/video-playing).
* **NFT Shape**: Displays the image of an NFT inside a frame. See [Display an NFT](/creator/scene-editor/build/nfts).
* **Particle System**: Emits particles from the Entity's location, for effects like smoke, fire or sparkles. See [Particle systems](/creator/scenes-sdk7/3d-content-essentials/particle-system).
* **Virtual Camera**: Defines a custom camera angle that the scene can switch the player's view to. See [Camera](/creator/scenes-sdk7/3d-content-essentials/camera).
* **Script**: Attaches a custom code module to the Entity, with parameters you can configure from the UI. See [Script component](/creator/scene-editor/extend-with-code/script-component).

{% hint style="warning" %}
**📔 Note**: Other components exist on the SDK that are currently only usable via code. You can also create your own [Custom components](/creator/scenes-sdk7/architecture/custom-components) via code, these won't have a UI representation, but can be added and edited via code.

See [Combine with code](/creator/scene-editor/extend-with-code/overview) for how to edit the code of your scene.

Also note that an Entity can only hold **one** of each Component. It's not possible to assign a second instance of a Component that already exists in the entity. For example, you can't add two **Actions** components to a same Entity.
{% endhint %}

## Smart items

[Smart items](/creator/scene-editor/interactivity/smart-items) can also include special components that Control the Entity's interactivity. These are typically:

* **Actions**: Lists all the possible actions the item can carry out.
* **Triggers**: Determines when the actions from the Actions component are carried out.
* **States**: Keeps track of the item's current state. The state can be used for conditional logic, to only trigger certain actions if the item is on certain state.
* **Counter**: Keeps track of a counter. The counter can be used for conditional logic, to only trigger certain actions if the counter's value is equal/greater/lower than a given value.

See [Smart items advanced](/creator/scene-editor/interactivity/smart-items-advanced) for more details.

## About entities and components

Everything in a scene is an Entity. All the items and smart items in the scene are Entities.

All the traits of an Entity are determined by its components. They define what the Entity is, where it is, how it sounds, and how it behaves. For example, a **Transform** component stores the Entity's coordinates, rotation and scale. A **MeshRenderer** component gives the Entity a visible shape (like a cube or a sphere), and a **Material** component gives the Entity a color or texture.

The values on components can change over time. In the Scene Editor you configure the initial values for these components. But once your scene is running, the player's actions or the passage of time can change those values.

For example, a moving platform Smart Item has an initial position that you set via its **Transform** component, but after the actions of this item make it move, its **Transform** will hold different values.

See [Entities and components](/creator/scenes-sdk7/architecture/entities-components) for an in-depth look at this concept and how they're used by Decentraland scenes.


# NFTs

Adding NFT Portraits to your scenes

You can add NFTs (Non-Fungible Tokens) into your scene, displayed as picture frames.

All image and gif formats that are supported in OpenSea are also supported by Decentraland by picture frames. NFTs in video or audio format are currently not supported. NFTs that also have 3D representations, like Decentraland wearables, are displayed in picture frames as 2D images.

## Adding an NFT

Use the NFT smart item, that you can find in the **Smart Items** asset pack, or by simply searching *NFT* in the search bar above. Once you drag a copy of the NFT item to your scene and select it, there are a few fields that you can configure.

![](/files/PhixDpQdPhu2XBr4m8ET)

The main fields to configure determine what NFT to display:

* **Network**: The blockchain network that your NFT is in. It uses Ethereum mainnet by default, but you can also pick Polygon (matic), or one of several test networks.
* **Contract**: The contract address of the collection that this NFT belongs to (ie: Cryptokitties, SuperRare, Decentraland Halloween Wearables 2019, etc)
* **Token**: The unique id of this specific NFT

To obtain these, the simplest way is to look them up in the Decentraland Marketplace and then check the URL. For example, from the URL of the following item:

*<https://market.decentraland.org/contracts/0xb932a70a57673d89f4acffbe830e8ed7f75fb9e0/tokens/20175>*

You can infer that the contract is *0xb932a70a57673d89f4acffbe830e8ed7f75fb9e0* (referring to SuperRare) and the ID is *20175*.

Similarly, you can also obtain these from the OpenSea URL of the token. For example, from the URL of the following item:

*<https://opensea.io/assets/0x31385d3520bced94f77aae104b406994d8f2168c/2614>*

You can infer that the contract is *0x31385d3520bced94f77aae104b406994d8f2168c* and the ID is *2614*.

Other optional fields that can be configured in the NFT smart item are:

* **Frame style**: The default frame style has a glowing margin that might not match the style of the artwork or your scene. There are several other options to pick from with varying styles, from baroque to minimalist, or even tape on the painting's corners.
* **Color**: NFTs with transparent background are given a background color, violet by default. You can choose any other color. Note that some frame styles, like *None*, don't include a background color at all.

{% hint style="warning" %}
**📔 Note**: You can only see these changes take effect when entering the scene in Preview mode. None of these changes modify the representation of the smart item that you drag around in edit mode.
{% endhint %}

See [Display an NFT](/creator/scenes-sdk7/media/display-a-certified-nft) for more details on how Decentraland handles NFT portraits.


# Spawn Areas

Using Spawn Areas to set the Spawning position & Spawn Camera position visually.

The creator can set the **Spawn Position** and **Spawn Camera Target** in the Creator Hub by editing a **Spawn Area** Entity.

This gives the creator a visual way of setting the Spawn Area and the direction the avatar will be facing when spawned as done with other objects in the scene.

Spawn Areas define where players appear when they access your scene directly, either by typing in the coordinates or teleporting. Your scene might have objects that can block players from moving if they happen to spawn right over them, like trees or stairs, or your scene might have an elevated terrain. It would be a bad experience for players if they spawned over something that doesn't let them move. That's why you have the option to set one or several spawn positions in ad-hoc locations.

{% hint style="warning" %}
**📔 Note**: All spawn points must be within the parcels that make up the scene. You can't spawn a player outside the space of these parcels.
{% endhint %}

<img src="/files/FHxZShrnMjIt17Tb7BhX" alt="" width="200">

The Spawn Area is composed of two different entities that work together:

* **Spawn** Entity: can be found inside the **Player** Entity. Defines the actual Spawn Point of the Player.

<img src="/files/sunTlL85fG6KMY8C2ols" alt="" width="200">

* **Camera Target** Entity: can be found inside the **Spawn Area** Entity. Move it to the desired direction in which the Player will be spawned.

<img src="/files/3O7W4mMPBjUnQ26fFqFv" alt="" width="200">

## Changing Spawn Areas

**Spawn Areas** and their **Camera Target** can be moved directly from the Scene Editor as with any other object in the scene, or modify its values manually (as with Transforms in other Entities).

### Parameters

When a Spawn Area is selected, the creator is able to see and set the following values on the Components section:

<img src="/files/eIIaLvarUdtTHTzNn83g" alt="" width="600">

* **Position**: Avatar's Spawn Position. These are coordinates inside the scene, relative to the scene's origin, similar to what you'd use in a Transform component.
* **Spawn Camera Target**: The direction the camera (and the avatar) will be facing once spawned into the scene. Use this to have better control over the player's first impression when they jump into your scene.
* **Randomized Area**: Adds randomness to the Spawn Area in meters, enabling and disabling it with the **Don't randomize** toggle. When enabled, an area is rendered in the Scene Editor, showing the area in which the Player can randomly be spawned in. The random offset applies on both the X and Z axis, and prevents all players from appearing overlapping each other when they spawn, which looks especially bad in crowded scenes.

<img src="/files/Wz3KsXWMQvM3t8CFyTgq" alt="" width="600">

## Multiple Spawn Areas

<img src="/files/vngZY9Yj3ha3emtFHD8G" alt="" width="600">

The creator can have multiple **Spawn Areas** defined. To create a new Spawn Area, follow these steps:

1. Select any Spawn Area, **spawn1** being the default.
2. All the Spawn Areas show on the right Panel. You can add new ones by clicking on **+ Add New Spawn Area**&#x20;

   <img src="/files/0tfZ2yxiyHSxN3XeEpP4" alt="icon" width="200">

   .

<img src="/files/xZnssx99KLU074X7NvDq" alt="" width="600">

3. Enable the **Main Spawn**&#x20;

   <img src="/files/hmN8qxKbLgMSnmQwxP7p" alt="icon" width="100">

   &#x20;of the desired Spawn Area. If there are many Spawn areas toggled as **Main Spawn**, the player will randomly appear in one of them.
4. Preview the scene.


# Interactivity

Add interactivity to your scene


# Smart Items - Basic

Using smart items in your scene to add interactivity.

Some of the items in the catalog of the Scene Editor are **Smart Items**. Players can interact with these, they have configurable properties, and they can trigger actions on other smart items. For example: doors that can be opened and closed, platforms that move up and down, or buttons and levers that can activate other items.

{% embed url="<https://www.youtube.com/watch?v=z7HF4GR01hE>" %}

You can recognize these items in the asset pack explorer because they have a lightning icon and a different colored background.

![](/files/2VeM7aYXByVIXH7sQeVr)

You can recognize which items in your scene are smart because they have the lightning icon next to them in the entity tree.

![](/files/wkG6wAC21LDDyeRoHfh1)

## Using items

To use a smart item, drag it into the scene like any other item. All items include a default behavior, run a scene preview try it out.

Here are some common items and their default behaviors:

* **Doors**: Doors are opened or closed when clicked. You can change this behavior so they're opened by buttons, trigger areas, etc.
* **Buttons**: When clicked, they play sound and an animation as feedback. Add more actions to their trigger events to activate other smart items.
* **Levers**: When clicked, they switch between two states. Make each position of the lever perform different actions on other smart items.
* **Chests**: They behave like doors, by default are opened or closed when clicking. You can place smaller items inside them.
* **Platforms**: They move between two positions. Use their tween actions to control where they move to, their speed, etc.
* **Trigger area**: An invisible item that can trigger other smart items when the player walks into its area. See [About trigger areas](#trigger-areas).
* **Video Player**: A screen for showing videos or live streams. See [Playing Videos](#playing-videos).
* **Audio Stream**: Play audio from a live stream. See [Playing Audio Streams](#playing-audio-streams)
* **NFT**: Display an NFT image as a portrait. See [Displaying NFTs](#displaying-nfts)

All smart items can be configured to behave in custom ways. For example how far a platform moves, or what a button activates.

## Configure an item

Select an item in the Scene Editor to view all of its properties on the right.

Some typical fields you can find in many items are:

* **Hover text**: What text is displayed on the UI as a hint when the player passes their cursor over the item. For example a door might say "Open"
* **Interaction**: With what button is the item activated? On a typical keyboard:
  * **Primary** is **E**
  * **Secondary** is **F**
  * **Pointer** is **Mouse Left Button**
  * **Action3** is key **1**
  * **Action4** is key **2**
  * **Action5** is key **3**
  * **Action6** is key **4**
* **When clicked**: Select what action is carried out when the item is interacted with, using the button from the **Interaction** field. You can activate as many actions as you want, these can be actions on that same item, or on other items too.

Each item has its own specific settings, that may vary from one item to another.

All items have an **Advanced Mode** that lets you configure almost anything about them. This includes things like what sounds are played, or in what direction a platform moves. You can also add custom actions that include all kinds of things, like teleporting the player, playing avatar animations, attaching an item to the player's hands, etc. You can also add conditional logic, to only activate something in certain scenarios. See [Smart Items - Advanced](/creator/scene-editor/interactivity/smart-items-advanced).

![](/files/kRENHyiVkryKY3vd7Hh4)

## Call an action on another item

Smart items can trigger actions on other smart items, so that they happen every time the item is activated. Just select the item you want to call, from a list of all items in the scene, then select an action. Different items expose different actions.

For example here's a button that opens or closes a door. Each time the button is pressed, the door will either open or close.

![](/files/0vYyGFNRQKIdREFi3ZGH)

Here's a lever that opens a door when activated, and closes that door when deactivated.

![](/files/1wrcIiJOyLANmyh6U7wo)

You can add as many different actions from different items to be triggered together. Just click **+ Assign Action**.

Remove actions by clicking the three dots next to an action and selecting *Remove action*.

You can also chain actions. For example, if the door that is opened by the lever includes an action in its own **When Opened** field, this action will also be triggered indirectly by the lever.

If you use the [Advanced mode](/creator/scene-editor/interactivity/smart-items-advanced) you can also add conditional logic to these kinds of actions.

## Special smart items

Some smart items have unique characteristics that make them very handy for common scenarios:

### Trigger areas

Use the Trigger Area smart item to trigger an action when the player walks into an area.

![](/files/KbTrQVodpFxfnlvpVfDb)

Use the **Player Enters Area** and **Player Leaves Area** trigger types on the item's **Triggers** components. The actions on these trigger events are activated every time that the player enters or leaves the area.

![](/files/txJdv8FyLjerpdkftrtD)

See [Trigger area](/creator/scene-editor/interactivity/trigger-area) for more info.

### Invisible walls

A collection of invisible shapes that can block players from walking through or clicking through an area.

These invisible walls can be useful when importing a 3D model that doesn't have a collider mesh, or when you want to create a wall that is not visible to the player.

See [Colliders](/creator/scenes-sdk7/3d-content-essentials/colliders) for more info.

### Click area

An invisible cube that can be clicked by players to trigger actions on any other smart items. This item can be enabled or disabled by any other smart item, when disabled it won't be clickable. You can also set the text that players see when pointing their cursor at it.

![](/files/gvvWBu8WUNeZOTYMBYnc)

### Playing videos

Play videos from either:

* **Local files**
* **Stream from a URL**
* **Stream live from** [**Decentraland Cast**](/creator/scene-editor/operate-live/live-streaming#dcl-cast-easy)
* **Stream live from** [**RTMP Software**](/creator/scene-editor/operate-live/live-streaming#stream-advanced) **(OBS, XSplit, StreamYard, etc.)**

{% hint style="warning" %}
**📔 Note**: Playing videos is demanding on performance, so keep the number of videos playing at the same time low. The engine limits how many videos can play simultaneously based on each player's quality settings (1 on low, 5 on medium, 10 on high), and pauses any videos beyond that limit. See [Play Videos](/creator/scene-editor/interactivity/video-screen#play-videos).
{% endhint %}

See [Play Videos](/creator/scene-editor/interactivity/video-screen) for more info.

### Playing audio streams

Play an audio stream from a URL, using the **Audio Stream** smart item.

{% hint style="info" %}
**📔 Note**: Not all streaming services allow you to play their audio outside their site. The following are some examples that work in Decentraland:

```ts
GRAFFITI = 'https://n07.radiojar.com/2qm1fc5kb.m4a?1617129761=&rj-tok=AAABeIR7VqwAilDFeUM39SDjmw&rj-ttl=5'
SIGNS = 'https://edge.singsingmusic.net/MC2.mp3'
DELTA = 'https://cdn.instream.audio/:9069/stream?_=171cd6c2b6e'
JAZZ = 'https://live.vegascity.fm/radio/8010/the_flamingos.mp3'
```

{% endhint %}

You can adjust the volume of your stream. Note that the audio from the stream is not positional, it is heard at an even volume through all your scene.

### Displaying NFTs

To display an NFT on a picture frame, use the **NFT** smart item. You must provide the following fields:

* Network

{% hint style="info" %}
**📔 Note**: Currently **ethereum** is the only supported network.
{% endhint %}

* NFT Collection Contract: The smart contract for the NFT collection.
* Token ID: The token ID of this particular NFT collectible.

<img src="/files/aQ2sf3jG1npf982nlpIx" alt="NFT shape" width="400">

You can obtain this information from [OpenSea](https://opensea.io), by checking the **Details** tab under the NFT image.

<img src="/files/VP3EHeDpRhKatzboyRlv" alt="OpenSea details" width="400">

{% hint style="info" %}
**📔 Note**: You can also obtain this information from the opensea URL. For example, if the NFT's URL is the following:

> `https://opensea.io/assets/ethereum/0x32b7495895264ac9d0b12d32afd435453458b1c6/1956`

You can complete the fields with the following:

* Network: ethereum
* Contract: 0x32b7495895264ac9d0b12d32afd435453458b1c6
* Token: 1956
  {% endhint %}

You can also configure a background color, this is particularly useful for NFTs with a transparent background.

You can also chose a **Frame style**, to frame the NFT in a variety of different styles, classic and modern.

See [NFTs](/creator/scene-editor/build/nfts) for more details.

### Health bars

![](/files/NCsm6lHVhKkJGQnxVWTE)

The **Health Bar** smart item is a great building block for several game mechanics. It can be used in various ways:

* Nest it under the **Player** to display the player's health over the avatar

  ![](/files/tmpVG0geuYppAnVWKIQF)
* Nest it under the **Camera** to display it fixed on the UI

  ![](/files/IXP61Qsx3PHTpq0Y4lbJ)
* Nest it under literally any item in the scene to keep track of that item's health

  ![](/files/bkV7VyxCYNgIJMhDI9zp)

Other items can interact with the health bar to add or subtract health from it.

* Items like the **Spikes** or **Robot Enemy** can lower health

  ![](/files/lnceFqkc1EeQaKIDiYyV)
* items like **First Aid** or the **Healing Pad** can restore it.

  ![](/files/wFMLv79M2qTbtbXRjCF3)

You must configure the Health Bar to define what will happen when the health equals 0. You might respawn the player to the position of a **Respawn Pad** smart item, reset the counter for their score, respawn any enemies, display a UI text, or whatever makes sense in your game logic.

You can also trigger actions when the health is lower than a certain value, for example play a special music or show a UI hint when health is less than 3.

Health bars can be configured to affect anything! For example, add a health bar nested under the **Wooden Door** smart item. This bar can have its health lowered by the player using the **Sword** smart item, but also from an explosion from the **Barrel** or the attack of the **Robot Enemy**. For this to work, configure the health bar so that it performs an action on its parent item when its value is 0.

![](/files/MYxhxIZmBedlNGF7dG0H)

Weapons like the **Sword** can be picked up by the player, and then used to cause damage on any other item with a health bar that's near the player when performing the action.

## Multiplayer

Almost all smart items have multiplayer behavior, so that all players in the scene share the same experience as the items change state. If player A opens a door, player B also sees that door open. If player C then walks into the scene while the other players are still there, she will see the door as already open too.

However, if there are no players near the scene, then the scene is restored to its default state. So if all players leave, but then player A comes back, she will find the door closed (if that was the default state of the door).

Make sure you design your scene so that the actions of one player don't sabotage the scene for others that come later. For example, if the scene is a puzzle game, you can use a *delay* action on a *tools* smart item to make all the items in the scene reset to their initial state a few seconds after the puzzle is solved.

You can also disable the multiplayer behavior of an item, see [Smart Items - Advanced](/creator/scene-editor/interactivity/smart-items-advanced).

## Troubleshooting

* *An item in my scene should be clickable, but can't be clicked*.

Make sure that it's not being obstructed by something else. You can't click through other items. Some items have a *collider mesh* that has a simplified geometry that may be obstructing your item, even though its visible shape doesn't seem to be doing it. Try moving the item to see what happens.

## See also

* [Smart items - Advanced](/creator/scene-editor/interactivity/smart-items-advanced)
* [States and conditions](/creator/scene-editor/interactivity/states-and-conditions)
* [Making any item smart](/creator/scene-editor/interactivity/make-any-item-smart)
* [Combine with code](/creator/scene-editor/extend-with-code/overview)


# Trigger Area

React to the player's position

To trigger an action when the player walks into or out of an area, use the Trigger Area [Smart Item](/creator/scene-editor/interactivity/smart-items).

![](/files/KbTrQVodpFxfnlvpVfDb)

The orange cube you see while editing your scene is only visible in the Scene Editor, it becomes invisible when running a preview of the scene. You can easily adjust and scale the orange cube to cover exactly the area you need.

If any part of the player's avatar overlaps with this orange cube, the assigned event will be called. Trigger areas react only to the player on the local machine, not to other players' avatars — each player fires the trigger on their own instance of the scene.

Use the **Player Enters Area** and **Player Leaves Area** trigger types on the item's **Triggers** component. The actions on these trigger events are activated every time that the player enters or leaves the area.

![](/files/txJdv8FyLjerpdkftrtD)

You can add as many different actions on the same trigger event, this will activate them all simultaneously.

{% hint style="info" %}
**💡 Tip**: If the trigger areas in your scene start getting in the way of editing other content, remember you can always lock and/or hide them from the [Entity Tree](/creator/scene-editor/get-started/scene-editor-essentials#the-entity-tree).

<img src="/files/nY578fcsXCorNvO9pWwu" alt="" data-size="original">
{% endhint %}

You can also add **Trigger conditions**, so that the actions are only carried out if certain conditions are met in the scene. For example, you could have a trigger area that opens a sliding door when the player walks in; you could use a condition there to check the state of a lever that acts as a power switch, and only open the door if the power is on. See [States and conditions](/creator/scene-editor/interactivity/states-and-conditions) for more details.

![](/files/qnkSPAFzM7n1Q6n3AIqt)

Multiple trigger areas can overlap, and don't affect each other.

{% hint style="info" %}
**📔 Note**: You can also use **On Player Enters Area** and **On Player Leaves Area** trigger events on any other smart item, but keep in mind that it can be challenging to know the area covered by the trigger.

The size of the triggerable area doesn't relate to the item's visible shape or its colliders, it's always a cube of 1m on each side, affected by the scale of the item.
{% endhint %}

{% hint style="info" %}
**💡 Tip**: Trigger areas in the Scene Editor fire only for the local player. If you need to also react to other players' avatars entering the area, use the Script component to add code and use the [SDK7 TriggerArea component](/creator/scenes-sdk7/3d-content-essentials/trigger-areas) with the `CL_PLAYER` collision layer, which detects all avatars.
{% endhint %}


# Video Screen

Play Videos in your scene

To play pre-recorded or streamed videos on a screen on your scene, use the Video Player [Smart Item](/creator/scene-editor/interactivity/smart-items).

![](/files/Kz8YR1z4Hft0RdmcX5Le)

## General settings

These settings are relevant for all scenarios, either if you're playing videos or streaming.

![](/files/KECLUiescO5vDL78XZSW)

You can configure the volume of the video's audio. Note that the audio from the stream is not positional, it is heard at an even volume through all your scene.

The **Default Media Sources** dropdown lets you pick between two different kinds of sources:

* **Video URL**: Fetch a video or a stream from a URL or local video file
* **Live Stream**: Use Decentraland's free streaming infrastructure to display a stream. To use this, you must also include an [Admin tools](/creator/scene-editor/operate-live/scene-admin) smart item in your scene.

## Play Videos

You can Play pre-recorded videos from either:

* **Local files**: Upload a video file as part of the scene, then point the *URL* field to the path to that file.
* **Stream from a URL**: Point to a live or pre-recorded stream on the web, for example from a provider like Bunny. See [streaming videos](#streaming-videos)

The timing of when the Video Player smart item plays a video can depend on different things:

* **Automatic**: The video starts playing as soon as the scene loads. For this, set the default media source dropdown to **Video URL** and paste a URL directly into the **Video Path or .m3u8 URL** field.

  ![](/files/KECLUiescO5vDL78XZSW)
* **Triggered by an admin**: A [Scene admin](/creator/scene-editor/operate-live/scene-admin) who's currently in the scene can use the Admin UI to paste a video URL and play it for all players who are currently in the scene.
* **Based on player actions**: Define an Action of type **Play Video**. This lets you trigger the playing of the video as the result of interacting with some other smart item, like walking into a room, or pushing a button. See [Smart Items - Advanced](/creator/scene-editor/interactivity/smart-items-advanced).

  ![](/files/lPzvQFDHvoPT6g8rSUdy)

In all cases you configure the video to either loop or play once.

{% hint style="warning" %}
**📔 Note**: If too many videos are playing at the same time in your scene, some will be paused by the engine. The priority is determined based on proximity to the player, direction of the camera and size of the screen. The maximum amount of simultaneous videos depends on the player's quality settings.

* Low: 1
* Medium: 5
* High: 10

We also recommend starting to play the video when the player is near or performs an action to do that. Starting to play a video when your scene is loaded far in the horizon will unnecessarily affect performance while players visit neighboring scenes.
{% endhint %}

## Multiple Video Screens

You can play the same video on multiple screens at the same time. To do this, you must edit the advanced properties of the Video Player smart item.

{% hint style="warning" %}
**📔 Note**: Avoid having more than one different video playing at the same time, as that hurts performance a lot.

If you simply paste the same URL on two video players, the engine won't know these are the same video, and will play them both separately. Follow the steps below to configure the second video player to play the same video as the first one.
{% endhint %}

1. Add Two Video Player smart items to the scene, one for each screen.
2. Configure the first one normally, as described in the [Play Videos](#play-videos) section.
3. On the second video player, remove the **Video Player** component.

![](/files/8D7h5Ea1jcoKeoFuWtMV)

{% hint style="warning" %}
**📔 Note**: This step is important, otherwise the second video player will be processed by the engine, even if not visible.
{% endhint %}

4. Still on the second video player, open the **Material** component, expand the **Texture** section, and select the **Video Source Entity** dropdown to point to the first video player.

![](/files/lvfnJ0aaRwcOJf4C2tzm)

You can do the same for any number of video players, as long as you configure each one to point to the same video player.

When doing [live streaming](/creator/scene-editor/operate-live/live-streaming), both screens will also display the same stream.

{% hint style="info" %}
**💡 Tip**: The steps above can also be repeated with an item that has a **Swap Material** component, to turn any 3D model into a video screen. Configure the **Texture** section inside the **Swap Material** component to point to the video player entity.
{% endhint %}

## About Video Files

The following file formats are supported:

* *.mp4*
* *.ogg*
* *.webm*

Keep in mind that a video file adds to the total size of the scene, which makes the scene take longer to download for players walking into your scene. The video size might also make you go over the [scene limitations](/creator/scenes-sdk7/optimizing/scene-limitations), as you have a maximum of 15 MB per parcel to use. We recommend compressing the video as much as possible, so that it's less of a problem.

## Live streaming

For end-to-end live streaming, see [Live Streaming](/creator/scene-editor/operate-live/live-streaming).

### Streaming from other sources

You can also stream videos using other streaming infrastructures. To do this, simply configure the Video Player smart item to use the **Video URL** media source, and paste the stream URL into the **Video Path or .m3u8 URL** field.

The source of the streaming must be an *https* URL (*http* URLs aren't supported), and the source should have [CORS policies (Cross Origin Resource Sharing)](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing) that permit externally accessing it. This means you can't stream a video from YouTube or similar sites, as these only allow displaying their content in their branded HTML widget. See [About External Streaming](/creator/scenes-sdk7/media/video-playing#about-external-streaming) for options and tips.

There are a number of options for streaming video. The simplest option is to use a managed hosting provider like [Vimeo](https://vimeo.com/), [Bunny](https://bunny.net), [Livepeer Studio](https://livepeer.studio/) or [Serraform](https://serraform.gitbook.io/streaming-docs/guides/decentraland-playback) where you pay a fee to the provider to manage all the streaming infrastructure.

Read [Setting up OBS for successful streaming](/creator/scenes-sdk7/media/video-playing#setting-up-obs-for-successful-streaming) for tips on how to best stream content into Decentraland.


# States and conditions

Managing item states and conditional logic

{% embed url="<https://www.youtube.com/watch?v=wm8ZD2kSyKA>" %}

## Conditional logic

Add conditions on a trigger, so that the action only occurs if those conditions are met. For example, clicking on a door only activates the "Open" action if it wasn't already open.

To add a condition, click the three dots icon next to **Trigger event** and select **Add Trigger Condition**.

![](/files/21fMLuwGiBIrCOE9qBHY)

A single trigger can include multiple conditions. Click the **+** icon to add more conditions. When more than one condition exist, you can select one of these options:

* **All Conditions should be met (AND)**: The trigger only happens if every one of the conditions is true.
* **Any Condition can be met (OR)** The trigger happens if at least one of the conditions is true.

![](/files/psOHVc3HfiZsIddRD2Ik)

### States

The **States** component is included on several smart items. It lists possible states that the smart item can be in. At any given time, the smart item is in one of these states. For example, a door can be *Open* or *Closed*. The Open action sets the state to *Open*, the Close action sets the state to *Closed*.

You can do the following things with states:

1. Use a condition on a trigger to check the state of an entity. In that way the action is only carried out if a specific state is active.

![](/files/21fMLuwGiBIrCOE9qBHY)

2. Change a state via the **Set State** action.

![](/files/XZFolCjYnQalwj8JYyWv)

3. React to changes in state via the **On State Change** trigger event.

To toggle between two actions, define two triggers, each with a condition that checks a state. For example, doors have one trigger that activates the Open action, with a condition that first checks that the door's state is *Closed*, and another trigger that activates the Close action, with a condition that checks that the door's state is *Open*. Only one of the two is activated each time the player clicks on the door.

![](/files/OSzY5RYGHHL6c0YushBw)

You can add as many states as you want to a smart item. Just click the **Add New State** button to add another one to the list.

![](/files/45KHrr1pIDADQLLfGmHC)

One of the states is selected as the default, the item will always start in this state when the scene runs. You can assign a different state to be the default by clicking the three dots next to another one of the states and selecting **Set as Default**.

{% hint style="info" %}
**💡 Tip**: Keep interactions between items simple. For example, avoid scenarios like having a button that opens a door by triggering three actions: play the door's animation, play the door's sound and change the door's state. Instead, make the button change the door's state. Then use an **On State Change** trigger so that the door itself handles playing the animation and sound whenever the state changes.
{% endhint %}

### Counter

Use the **Counter** component to keep track of a number, which can change as the player performs actions in the scene. You can use the values of the counter in conditional logic.

When an entity has a Counter component, you can run the following actions on it:

* **Increment Counter**: Increment the value of the counter by a configurable **Amount**, 1 by default.
* **Decrease Counter**: Decrease the value of the counter by a configurable **Amount**, 1 by default.
* **Set Counter**: Set the value of the counter to a specific number, for example to set it back to 0.

Use the **On Counter Change** trigger to perform an action every time the counter's value changes. Add a condition to this trigger so that it only activates after passing a certain threshold.

![](/files/P0tCYP60i7fVDNPyI1j0)

On a condition, you can check if the value of the counter is

* Greater than a given value
* Lower than a given value
* Equal to a given value

{% hint style="info" %}
**💡 Tip**: To check for greater or equal, you can add two conditions to the trigger event, using the AND option.

To make an action occur only once when passing a threshold, and not repeat on every increment after that, combine the counter with a **State** component. Set the State to "Done" whenever you reach the desired value, and add a condition to check this state on the trigger event.
{% endhint %}

### See also

* [Smart items - Basics](/creator/scene-editor/interactivity/smart-items)
* [Smart items - Advanced](/creator/scene-editor/interactivity/smart-items-advanced)
* [Making any item smart](/creator/scene-editor/interactivity/make-any-item-smart)
* [Combine with code](/creator/scene-editor/extend-with-code/overview)


# Smart Items - Advanced

Using smart items in your scene to add interactivity.

Most smart items have a basic module where you can configure only the most common settings in a simple way, but you can scroll down past the **Advanced** marker to customize almost anything about how the item behaves.

{% embed url="<https://www.youtube.com/watch?v=m_xWCSDDxpQ>" %}

The following item has a Transform component and a basic module that exposes only the basic fields for configuring a button. But if you scroll down past the **Advanced** marker, you'll find all the available settings.

![](/files/86lqKK0mQ0il0BnCyUWJ)

{% hint style="info" %}
**📔 Note**: Most of the settings in the basic module are also available in the components lower down. The changes done in the basic module are reflected in the components lower down and vice versa, except for some cases where the basic settings are an abstraction of multiple settings lower down. In those cases, changing the advanced settings to values that are not supported by the basic module will result in the field in the basic module being marked as undefined.
{% endhint %}

## Advanced configuration

Properties are grouped into [**components**](/creator/scenes-sdk7/architecture/entities-components). Different smart items may have different components, depending on their functionality.

The behavior of most items is controlled by:

* [**Actions**](#actions): The Actions component defines things that the item can do. For example play a sound, play an animation, move up, or become invisible.
* [**Triggers**](#triggers): The Triggers component assigns what events make those actions happen. For example when the player clicks on the item, when the player walks into an area, or when the scene first loads.

For example, in a door smart item, the **Actions** component includes "Open" and "Close" actions. The **Triggers** component in that item includes an **On Click** trigger that activates the "Open" action when the door is clicked by the player.

The triggers of a smart item can activate actions on any smart item in the scene, not just on that same smart item. For example, a button smart item can have a **Triggers** component that activates the "move up" action defined on the **Actions** component of a floating platform.

Triggers can also happen conditionally. For example, door smart items include two **On Click** triggers in its Triggers component: one opens the door if that door was closed, the other closes the door if it was open. For more details see [States and conditional logic](/creator/scene-editor/interactivity/states-and-conditions).

## Interactions between items

To make items interact with each other:

* One item needs to have at least one action defined in an [Actions](#actions) component.
* The other item needs a trigger in the [Triggers](#triggers) component that points to that action.

For example, to make a button open a door:

1. Add any button smart item, open its **Triggers** component. It has a default trigger event that plays a sound and an animation for the button itself.
2. Click the **+** sign next to **Assigned Actions**, to add a third action on that same trigger event.
3. Select the smart item for the door on the first dropdown.
4. On the second dropdown, select the "Open" action.

![](/files/0vYyGFNRQKIdREFi3ZGH)

{% hint style="info" %}
**💡 Tip**: You can instead create a new Trigger event that only handles the door's action. Both trigger events are called every time the button is clicked.

<img src="/files/RwgmNefUCbfZUYyK5R0W" alt="" data-size="original">
{% endhint %}

Any item can trigger any action from any other item, as long as the action is defined. See [Triggers](#triggers) for more ways in which an action can be triggered.

You can use [states and conditional logic](/creator/scene-editor/interactivity/states-and-conditions) to only trigger an action if a condition is met. The condition can even check the state of a third smart item. For example, a button only opens the door if the a custom "power generator" smart item has its state set to "On".

## Actions

The **Actions** component lists actions that the item can carry out. Each smart item includes a set of pre-defined actions. You can customize existing actions or add new ones. The following types of actions are available:

* **Play Animation**: Plays an animation in the 3D model of the item. See [About playing animations](#about-playing-animations)
* **Stop Animation**: Stops all animations being played by the 3D model of the item.
* **Play Sound**: Plays a sound from a file, at the location of the item. See [About playing sounds](#about-playing-sounds)
* **Stop Sound**: Stops all sounds playing from the item.
* **Start Tween**: Makes a gradual change in position, rotation or scale over a given period. See [Moving, rotating or scaling](#moving-rotating-or-scaling).
* **Set Visibility**: Makes the item visible or invisible.
* **Attach To Player**: Sets the item as a child of the player's avatar. For example to carry it on their hand or above their head.
* **Detach From Player**: Detaches the item from the player's avatar.
* **Open Link**: Opens a link to an external website on a browser tab. Players are asked if they trust the domain before it opens.

{% hint style="info" %}
**📔 Note**: This action can only happen as a result of clicking on an item. It can't be triggered by walking into a trigger area.
{% endhint %}

* **Move Player**: Change the position of the player to a set of local coordinates inside the scene. It's only possible to move the player inside the same scene.
* **Teleport Player**: Teleport a player to another location in Decentraland. Use the **Teleport Mode** dropdown to either send them **To coordinates** of another scene in Genesis City, or **To World**, indicating a World's name. Players will appear in the spawn-point of the destination scene.
* **Play Emote**: Make the player's avatar perform one of the default avatar animations (eg: wave, or clap).
* **Play Custom Emote**: Make the player's avatar perform a custom animation, from a file uploaded to the scene.
* **Show Text**: Display text on the screen's UI, to be hidden after a few seconds. Ideal hints, dialog lines, notifications, etc.
* **Hide Text**: Hides any UI text that might be currently displayed.
* **Start Delay**: Delays another action of the same item by as many seconds as you need.
* **Stop Delay**: Cancels any delayed actions on the item.
* **Start Loop**: Replays an action from the same item recurrently at a given interval.
* **Stop Loop**: Cancels any looped actions on the item.
* **Play Video**: Play a video as a material on a primitive shape.
* **Stop Video**: Stop any videos currently played.
* **Play Audio Stream**: Play an audio stream.
* **Stop Audio Stream**: Stop any audio streams currently playing.
* **Clone**: Duplicates an item in the designated position.
* **Spawn Entity**: Creates a new copy of an item in the scene, at a position relative to the item performing the action. The item to spawn doesn't need to be placed in the scene. See [About spawning entities](#about-spawning-entities).
* **Remove**: Deletes an item from the scene.
* **Show Image**: Displays an image on the UI, potentially for a limited time. It can also include caption.
* **Hide Image**: Hides any image currently displayed in the UI via the Show Image action.
* **Damage**: Reduces the health on any healthbar that is near. The *Layer* property can determine if it only acts on healthbars on the player, or on other items.
* **Move player here**: Changes the player's position to that of this item.
* **Place on Player**: Changes the item's position to that of the player.
* **Rotate as Player**: Changes the item's rotation to that of the player.
* **Place on Camera**: Changes the item's position to that of the camera.
* **Rotate as Camera**: Changes the item's rotation to that of the camera.
* **Set Position**: Changes the item's position to a specific one. It can be absolute or relative to its current position.
* **Set Rotation**: Changes the item's rotation to a specific one. It can be absolute or relative to its current rotation.
* **Set Scale**: Changes the item's scale to a specific one. It can be absolute or relative to its current scale.
* **Follow Player**: Starts moving and turning in direction to the player's position. It ignores any obstacles on the way. You can set the speed and make it only move on certain axis. Min Distance determines how close it will come to the player.
* **Stop Following Player**: Stops the Follow Player action.
* **Random Action**: One of the actions listed here will be played at random with equal probability each time the random action is called. You can list any of the actions that belong to the item.
* **Batch Actions**: All of the actions listed here will be played simultaneously each time the batch action is called. You can list any of the actions that belong to the item.
* **Heal Player**: Restore health to the player's health bar.
* **Player Face Item**: Makes the player's avatar turn to face the item.
* **Freeze Player**: Prevents the player from moving, jumping or performing emotes.
* **Unfreeze Player**: Restores the player's ability to move after a Freeze Player action.
* **Lights On**: Turns on the item's **Light Source** component.
* **Lights Off**: Turns off the item's **Light Source** component.
* **Lights Modify**: Changes properties of the item's **Light Source** component, like its color or intensity.
* **Select Camera**: Switches the player's view to a **Virtual Camera**, either on this item or on another entity.
* **Change Text**: Changes the text of an item with a **Text Shape** component. It can also change the font size and color.
* **Stop Tween**: Stops any tween movement currently in progress on the item.
* **Slide Texture**: Continuously slides the texture on the item's material in a given direction, for effects like flowing water or conveyor belts.
* **Change Collisions**: Enables or disables the item's colliders, both for physics and for pointer events.
* **Change Skybox**: Changes the scene's skybox to a fixed time of day, expressed in seconds since midnight.
* **Reset Skybox**: Restores the scene's skybox to its default settings.
* **Log to Console**: Prints a message to the console, useful for debugging while developing the scene.
* **Delete**: Removes the item and all of its children from the scene.

See [states and conditional logic](/creator/scene-editor/interactivity/states-and-conditions) to learn about other actions related to logic conditions, like **Set State** and the counter actions.

The **Actions** component defines possible actions, but these don't do anything in the scene unless they are triggered. Actions are activated by a [trigger](#triggers), either from the same smart item, or from a different one.

To add a new action to an item, click the **Add New Action** button at the bottom of the Action component. Then give the action a name, select a type, and complete any additional fields specific to the type of action.

![](/files/TLT8nNRtUTFicmLhRmUg)

### Triggers

The **Triggers** component defines trigger events, these activate actions when a certain event happens. The following types of trigger events exist:

* **On Click**: When the player clicks on the item. See [About click triggers](#about-click-triggers)
* **On Input Action**: When the player presses an input button while pointing at the item.
* **On Global Click**: When the player clicks the pointer anywhere, without needing to point at the item.
* **On Global Primary**: When the player presses the Primary (E) button anywhere.
* **On Global Secondary**: When the player presses the Secondary (F) button anywhere.
* **Player Enters Area**: When the player enters an area. See [Trigger Area](/creator/scene-editor/interactivity/trigger-area)
* **Player Leaves Area**: When the player leaves an area. See [Trigger Area](/creator/scene-editor/interactivity/trigger-area)
* **On Spawn**: When the scene starts, or the item is spawned in the scene. See [Trigger on spawn](#trigger-on-spawn)
* **On Delay**: When a **Start Delay** action on the item finishes its countdown.
* **On Loop**: On every iteration of a **Start Loop** action on the item.
* **On Clone**: When the item is cloned via a **Clone** action, the new copy fires this trigger.
* **On Click Image**: When the player clicks on an image displayed by a **Show Image** action.
* **On Damage**: When the item receives damage from a **Damage** action.
* **On Heal Player**: When the player is healed by a **Heal Player** action.
* **On Tick**: On every tick of the scene, once per frame. Use with caution, as the actions triggered by it run very frequently.

See [states and conditional logic](/creator/scene-editor/interactivity/states-and-conditions) to learn about other triggers related to logic conditions, like **On State Change**, **On Counter Change** and **On Tween End**.

To add a new trigger, click the **Add New Trigger Event** at the bottom of the Trigger component. Then select the type of trigger, the entity you want to activate and an action from that entity.

![](/files/GMJFQtBIkDv3EbB1Iiy5)

{% hint style="info" %}
**📔 Note**: An action needs to be defined in the [Actions](#actions) component of the entity before you can trigger it. Triggers can only affect entities that have an Actions component.
{% endhint %}

## About Playing Animations

Use an action of type **Play Animation** to run an animation on the 3D model of the smart item. The animation needs to already exist as part of the 3D model file. The **Select Animation** dropdown displays a list of all of the available animations in the 3D model.

The **Play Mode** field lets you select if an animation should play just once, or if it should keep looping.

![](/files/OP4kkGPhauEde1ppP68S)

Once the action is created, you can activate it via the [Triggers](#triggers) component of that same item or of any other item.

Use the **Stop Animation** action to stop all animations by the item, both looping and non-looping.

{% hint style="info" %}
**💡 Tip**: To easily check the contents of a 3D model, to see what animations it includes and what they look like, a good tool is the [Babylon Sandbox](https://sandbox.babylonjs.com/). Just drag the 3D model file into the window. A dropdown with a list of its animations should appear on the bottom.
{% endhint %}

To learn more about animations and how you can create your own as part of a 3D model, see [Animations](/creator/3d-modeling-and-animations/animations).

## About Playing sounds

Use an action of type **Play Sound** to play a sound file. You can play any sound file as long as it's imported into the scene project. The sound is heard positionally, from the location of the item, meaning they sound louder if the player is closer.

{% hint style="info" %}
**💡 Tip**: Instead of typing in the path to the sound file, you can drag it into the **Path** field from the file navigation menu on the bottom of the Scene Editor.
{% endhint %}

Use the **Play Mode** field to chose if playing the sound once, or looping it continuously.

![](/files/o2powiRcYRW734LidRTy)

Once the action is created, you can activate it via the [Triggers](#triggers) component of that same item or of any other item.

Use the **Stop Sound** action to stop all sounds by the item, both looping and non-looping. This also stops sounds from the **AudioSource** component.

To make an item play a looping sound always, for example for ambience or music, it's easier to use the **AudioSource** component, instead of using Actions and Triggers. This component only requires that you provide a path to a file, and check the boxes **Start Playing** and **Loop**.

![](/files/vsIZDWGSU5pOuZjUtMeK)

{% hint style="info" %}
**📔 Note**: A smart item can only play one sound at a time. Calling a second sound will interrupt any other sounds currently sounding. This also applies to sounds of the **AudioSource** component. If you need two sounds to sound together, consider adding an invisible entity in the same location to hold a **Play Sound** action.
{% endhint %}

See [sounds](/creator/scenes-sdk7/3d-content-essentials/sounds) for more about playing sounds in Decentraland.

## Moving, rotating, or scaling

Use a **Start Tween** action to change the **position**, **scale**, or **rotation**, of the item over a period of time. All **Start Tween** actions start from the original state of the item, and change to an ending state over a period of time.

Tweens in position can be relative or absolute. An absolute tween in position moves the item to a fixed position in relation to the scene. The item will move from wherever it is to that position. If it's already there, it won't appear to move. A relative tween in position moves the item a certain distance from where it is now, for example a tween to a relative position of `1, 0, 0` moves the item 1 meter forward, in the direction it's currently facing. If you run the tween action a second time, the item will move another meter forward.

Tweens in rotation can also be relative or absolute. A relative rotation is added to the item's current rotation. An absolute tween in rotation will make the item face a specific direction, relative to the scene.

Use the **Duration** field to set how long the whole movement should take, in seconds. Note that the slider goes up to 100 seconds, but you can also write a larger number manually if you need to.

![](/files/1mr5SDMLIa3Sm2DOQg96)

Once the action is created, you can activate it via the [Triggers](#triggers) component of that same item or of any other item.

Tweens can follow different **Curve Types** that affect the rate of change over time. A **linear** curve (default), means that the speed of the change is constant from start to finish. There are plenty of options to chose, that draw differently shaped curves depending on if the beginning and/or end start slow, and how much. An **easeinexpo** curve starts slow and ends fast, increasing speed exponentially, on the contrary an **easeoutexpo** curve starts fast and ends slow.

![](/files/82t11zoKwDuGRnAJn5Le)

{% hint style="info" %}
**💡 Tip**: Experiment with different movement curves. The differences are often subtle, but we subconsciously interpret information from how things move, like weight, friction, or even personality.
{% endhint %}

Use **On Tween End** trigger events in the **Triggers** component to activate an action after a tween has finished. Use [states and conditional logic](/creator/scene-editor/interactivity/states-and-conditions) to describe a looping path for a floating platform, so that it constantly moves between two locations.

When an item performs a tween, this affects everything about the item. For example, if it changes scale, it changes the scale of its visible 3D model and also invisible collider geometry, the size of text, etc. If the item has any children (nested in the entity tree on the left), these child entities are also affected by the tween.

{% hint style="info" %}
**📔 Note**: Each entity can only perform one tween at a time. For example, you can´t make an item move sideways and also rotate at the same time. As a workaround, you can use parented entities. For example, you can have an invisible parent entity that moves sideways, with a visible child that rotates.
{% endhint %}

## About spawning entities

Use a **Spawn Entity** action to create a new copy of an item in the scene while it's running. Unlike the **Clone** action, the item you spawn doesn't need to be placed in the scene first.

### Make an item spawnable

Before an item can be spawned, it must be available in your project's files. To add an item without placing it in the scene:

1. In the **Assets** panel, find the item in the catalog or in your **Custom Items**.
2. Right-click the item and select **Add to filesystem**.

This copies the item into your project so it can be spawned later. It doesn't add anything visible to the scene. The item then appears in the **Source** dropdown of any **Spawn Entity** action.

### Configure the action

A **Spawn Entity** action has two fields:

* **Source**: The item to spawn. Pick from the items added to your project's files.
* **Position**: The X, Y, and Z coordinates where the new copy appears, relative to the item performing the action.

If the item you spawn is itself a smart item, each spawned copy keeps its own actions and triggers working independently.

{% hint style="info" %}
**💡 Tip**: To spawn items from code instead, see [Composites](/creator/scenes-sdk7/architecture/composites). Items added to your project's files are stored as composites, the same format used by the SDK's spawn function.
{% endhint %}

## About click triggers

To trigger an action by clicking on an item, create an **On Click** trigger. The action will be activated every time that the player clicks on the entity.

![](/files/Wj5r5hRgKvt6g7mqYzUq)

See [Make any item smart](/creator/scene-editor/interactivity/make-any-item-smart#interactivity) for more details.

{% hint style="info" %}
**📔 Note**: When using custom 3D models, the model must have an invisible collider geometry for it to be clickable. See [colliders](/creator/scenes-sdk7/3d-content-essentials/colliders#pointer-blocking).

As an alternative, you can configure the **GLTF** component of the item, so that its **Visible Layer** of collision is set to **Pointer**.

Another alternative is to add a **Click Area** smart item, to draw a cube that overlaps the item you want to click. The Click Area smart item is an [invisible item](#invisible-items).
{% endhint %}

## Trigger on spawn

Triggers of type **On Spawn** activate an action when the scene is loaded. Instead of waiting for the player to interact with an item, the action runs right away.

For example, use this to make a platform move continually. Use an **On Spawn** trigger to activate a tween action. Then use **On State Change** triggers to keep it moving between two or more positions.

![](/files/dBxHKEhkdI2zIsy8JSWx)

## Multiplayer

All smart items are multiplayer by default. See [Smart Items - Basic](/creator/scene-editor/interactivity/smart-items) for more details.

You can change or fine-tune this multiplayer behavior to only sync certain components of the item.

In the item's **Multiplayer** component, check the boxes for the components you want to share.

For example, a door shares its `Animator` so all see the opening animations, its `AudioSource` so all hear its sound, and its `State` so all keep track of if it's currently open or closed. The door doesn't share its `Visibility` component, because the door is usually always visible. If you include actions to trigger its visibility on and off, you might want to have this component ticked too, so that changes are synced between all players.

## Invisible items

Some items are not meant to be seen by the player, but are visible while editing your scene to make them easier to manage. This is the case for items like **Ambience**, **Trigger Area**, **Click Area**, etc.

In the advanced mode, these items have a **Visibility** component set to invisible. This component doesn't affect the visibility of the items on the Scene Editor, but any item set to invisible isn't seen by players when running a preview.

## See also

* [Smart items - Basics](/creator/scene-editor/interactivity/smart-items)
* [States and conditions](/creator/scene-editor/interactivity/states-and-conditions)
* [Making any item smart](/creator/scene-editor/interactivity/make-any-item-smart)
* [Combine with code](/creator/scene-editor/extend-with-code/overview)


# Make any item smart

Configure any item to behave like a smart item.

{% embed url="<https://www.youtube.com/watch?v=wnnEU8GCLjc>" %}

Smart items are just regular items with an **Action** and/or **Trigger** component. You can add these components to any item in your scene. You can also import your own custom 3D models and add the same to those.

To add components to an item click the **Plus Icon** next to the item name, and select what component to add from the dropdown list.

![](/files/kQR7c8lHSxkJkqEZT6ij)

This allows for a huge amount of creative possibilities. Turn a candle into a lever that opens up a secret passage behind a book shelf, play mysterious sounds from inside a well, make diamonds into collectable items that shrink to 0 when clicked. There are tons of imaginative ways to combine these mechanics!

## Interactivity

You can make an item react to different actions of the player.

{% hint style="info" %}
**💡 Tip**: When a player interacts with an item, you should show some kind of feedback to make that interaction clear. If the model doesn't have any animations, consider at least playing a sound. In some cases it might work to make the item do a slight tween in scale and then return to its original scale, as a form of feedback.
{% endhint %}

Add a **Trigger** component, to detect to different actions from the player:

* **Pointer events**: When the player clicks or presses a key while aiming their cursor at the item.
* **Global button events** When the player presses a key, wherever they are in the scene.
* **Player proximity**: When the player walks into the item's position.

The **Trigger** component can be configured to be aware of any of these types of triggers. Every time a trigger happens, it can call Actions from their own **Actions** component, or from the **Actions** components of other items in the scene. See [Smart items - Advanced](/creator/scene-editor/interactivity/smart-items-advanced).

{% hint style="info" %}
**💡 Tip**: You can also combine these triggers with [conditional logic](/creator/scene-editor/interactivity/states-and-conditions), so that the actions don't get called every time the trigger happens, only if the conditions are true.

For example, you could add a **Pointer Events** trigger to a door, so that it opens when clicked, but include conditional logic so that it only opens if it's unlocked.
{% endhint %}

### Pointer events

Add a **Trigger** component with **On Click** or **On Input Action** Trigger events.

* **On Click** reacts to every time the player clicks the left-mouse button while pointing at the item.
* **On Input Action** reacts to every time the player presses the Primary Button (E) while pointing at the item.

![](/files/Wj5r5hRgKvt6g7mqYzUq)

**Colliders**

It's important that for an item to be clickable, it must have a **Collider**. Otherwise your clicks will go right through the model, and try to interact with whatever is behind. The 3D models in the default Asset Packs should all have colliders, but if you create your own model or source if from elsewhere, you may find it's missing one.

If your model is lacking colliders, any of the following should fix it:

* Add a **Mesh Collider** component. This will create a collider with a [primitive shape](/creator/scenes-sdk7/3d-content-essentials/shape-components#primitive-shapes) (cube, plane, cylinder, sphere).
* Change the properties of the **Collisions** section on the **GLTF** component. The **Visible layer** should be assigned to **Pointer**.
* Edit the 3D model in Blender to include an invisible collider geometry (any mesh with a name that ends in `_collider`). See [colliders](/creator/3d-modeling-and-animations/colliders).

{% hint style="info" %}
**💡 Tip**: If you used the **Mesh Renderer** component to give your model a primitive shape, that alone won't give it a collider. You must also assign it a **Mesh Collider** component.
{% endhint %}

**Customize pointer events**

You can override the default settings that are used when an item has an **On Click** or an **On Input Action** Trigger Action.

* **Hover text**: Change the hint that players see next to the cursor when hovering over the item. This can be very helpful for clarifying what your item does.
* **Max distance**: How far away can the player be when interacting with your item.
* **Show feedback**: If unchecked, the item has no hover-hint when the player passes their cursor on it.
* **Button**: If using the **On Input Action** Trigger Action, you can reassign the default **Primary (E)** to another key. The hover-hint will include an icon to clarify what key to use. You can use **Secondary (F)**, or **Actions 3 to 6** (number keys 1 to 4).

### Global button events

Add a **Trigger** component with **On Global Click**, **On Global Primary** or **On Global Secondary** Triggers events.

* **On Global Click** reacts to every time the player clicks the left-mouse button, anywhere in the scene.
* **On Global Primary** reacts to every time the player presses the Primary Button (E), anywhere in the scene.
* **On Global Secondary** reacts to every time the player presses the Secondary Button (F), anywhere in the scene.

{% hint style="info" %}
**💡 Tip**: It often makes sense to combine this with [States and conditions](/creator/scene-editor/interactivity/states-and-conditions), so that the items only react to the button event if the player is in the room, or some other condition.
{% endhint %}

### Player position

Add a **Trigger** component with **Player Enters Area**, **Player Leaves Area** Triggers events.

This will react to when the player enters or leaves an area of a default size of 1x1x1, positioned at the center of the item.

{% hint style="info" %}
**💡 Tip**: It's often better to use the [**Trigger Area**](/creator/scene-editor/interactivity/smart-items#trigger-areas) smart item instead, since this item's dimensions can be clearly visualized in the Scene Editor.
{% endhint %}

## See also

* [Smart items - Basics](/creator/scene-editor/interactivity/smart-items)
* [Smart items - Advanced](/creator/scene-editor/interactivity/smart-items-advanced)
* [States and conditions](/creator/scene-editor/interactivity/states-and-conditions)
* [Combine with code](/creator/scene-editor/extend-with-code/overview)


# Custom Items

Create your own custom items to reuse on any of your scenes.

Define a Custom Item to reuse it easily on any of your scenes, or share it with other scene creators. Custom items can consist of a single entity, or as many entities as you want. Custom items can be variations of existing Smart Items, or entirely custom, with their own tailored models and functionality.

{% embed url="<https://www.youtube.com/watch?v=7cGLu8P7dso>" %}

## How to Define a Custom Item

Right-click on an entity on the [Entity Tree](/creator/scene-editor/get-started/scene-editor-essentials#the-entity-tree), or select several entities and then right-click on them. Select **Create Custom Item**.

![](/files/zrwzfSYQ2u37OmOJ3qfR)

On the lower section of the screen you are then asked to give your new Custom Item a name.

![](/files/NqXFKtGMlVtwna52VdYH)

The item is now listed on the **Custom Items** tab, at the bottom of your screen. This tab is only displayed if at least one Custom Item exists in your workspace.

![](/files/HkNFxAZ0T5t9tXKzHjaR)

When defining a custom item, you can select several entities at a same hierarchical level, but not entities from separate parents if they don't share a common ancestor. Any nested entities are automatically included as part of the custom item, they don't need to be selected.

The original entities in your scene aren't affected by the action of defining a Custom Item.

{% hint style="warning" %}
**📔 Note**: When defining a Custom Item, you take a snapshot of the state of every component on the selected entities (except for the root entity's position, rotation, and scale). This includes **Actions**, **Triggers**, **Multiplayer**, **Scripts**, **Visibility**, and any other component.

Any smart item actions and triggers will self-reference their own copy. For example, if you define a Custom Item that includes an elevator and buttons, the buttons on each copy of the elevator will control the copy of the elevator that they belong to, not the original copy of the elevator.
{% endhint %}

### Using Custom Items

Simply drag the item from the **Custom Items** tab into your scene.

Once added, you're free to alter any property of a Custom Item, the changes you make only affect *that copy* of the Custom Item. You can also edit or delete the original items that the Custom Item was defined from, this won't affect existing or future copies.

Notice that Custom Items are displayed with a different icon on the Entity Tree. At the top of the Item properties menu on the right, you'll also see a mention of which Custom Item they were created from.

To delete a custom item definition, right-click on the item on the **Custom Items** menu and select **Delete**. This action doesn't affect any existing copies of the item on your scenes, orphaned Custom Items remain on your scene unchanged. Deleting a Custom Item definition only removes it from the Custom Items tab.

To rename a Custom Item definition, right click on the Custom Item definition on the **Custom Items** tab and select **Rename**.

You can't modify the definition of a Custom Item that's already created, you must create a new definition and delete the original.

### Spawning Custom Items dynamically

Each Custom Item is stored as a composite, a file that describes a tree of entities and components. This means you can spawn a new copy of a Custom Item while the scene is running, instead of placing every copy by hand.

You can spawn a Custom Item in two ways:

* **With no code**: Use the **Spawn Entity** action in the Scene Editor. See [About spawning entities](/creator/scene-editor/interactivity/smart-items-advanced#about-spawning-entities).
* **With code**: Use `Composite.instance()` in the SDK. See [Composites](/creator/scenes-sdk7/architecture/composites).

### Sharing Custom Items

You can share your custom items with other creators, so they can use them on their own scenes.

Custom Items are stored each on a separate folder on your local machine. Open that folder by clicking the folder icon <img src="/files/hZkvKIU6SMEvEGHnD3Se" alt="Code" data-size="line"> in the top right of the Custom Items tab.

You can also manually find this folder on your machine:

* In Windows: *User/AppData/Roaming/creator-hub/Custom Items*
* In Mac: *Users/username/Library/Application Support/creator-hub/Custom Items*

{% hint style="warning" %}
**📔 Note**: The *Library* folder is hidden in Mac by default. The easiest way to access it is by opening Go > Go to Folder, and Typing *application support/creator-hub*
{% endhint %}

To share with someone else, simply open the Custom Items folder and copy the full folder for the item. You may want to zip the folder to make it easier to transfer. This folder contains everything needed to use your Custom Item.

The person using your Custom Item must then unzip the item folder in their own Custom Items folder on their machine. They may need to click the Refresh button <img src="/files/JQOZvIu2ZJwEyAgb9iHh" alt="Refresh" data-size="line"> for the item to appear in their **Custom Items** tab.

Any **Assets** used by your Custom Item are also stored in the Custom Item's folder. This includes any 3D models, images, scripts, sounds, and videos referenced by the item.


# Extend with code


# Combine with code

Combine content created on the Scene Editor with the power of writing code.

{% embed url="<https://www.youtube.com/watch?v=55H37rygD7M>" %}

The Creator Hub plus custom code is a very powerful combination for creating content. You can use the canvas to visually position items intuitively, and then write code that interacts with these items with complete freedom. You can even place a smart item, that has its own default behavior, and write code that reacts to when the item is activated.

For example, you can take advantage of an existing lever smart item, that already comes with its sounds and animations and states, and write code that detects when the lever is pulled to run your own custom logic.

See [Reference items in code](/creator/scene-editor/extend-with-code/reference-items) for how to fetch items by name or by tags from your code.

## Editing code

You must install a code editor on your machine to edit the code of your scene. The recommended options are:

* <img src="/files/jIlOtBcgbGW7g62EK2XS" alt="VS Code" data-size="line"> [Visual Studio Code](https://code.visualstudio.com/): This is the recommended option for experienced developers.
* <img src="/files/h9LKmSXj7ZZZQjtEeiIB" alt="Cursor" data-size="line"> [Cursor AI](https://www.cursor.com/): This is a powerful code editor that is integrated with AI. It lets you pick different AI models to help you write code; a free tier is available, and more advanced models require a paid plan. This is a good option for developers who are new to Decentraland or TypeScript, or if you want to save time writing code.

{% hint style="warning" %}
**📔 Note**: If you are on macOS, make sure the code editor app is in the Applications directory.
{% endhint %}

Once installed, you may need to select your Code Editor in the settings of the Creator Hub. To do this,

1. Open the wheel icon in the top-right of the screen
2. Under **Code editor of choice**, select your Code Editor. You may find your editor listed in the dropdown, or you may need to select **Choose from your device...** to find it.

## Open a scene's code

Once you installed a code editor on your machine, and selected it in the settings of the Creator Hub, you can click the **< > CODE** button to open it on your scene project.

![](/files/jjBKzspRh4t2aDMEwv7d)

This opens a separate window with the code editor. On the left margin you can navigate the files and folder structure of your project.

![](/files/4D7DPjkUf51OzJbNEURN)

Add your custom code in the `index.ts` file under `/src`, inside the `main()` function. You can otherwise add custom code outside that function or create new `.ts` files inside the `/src` folder, but these must be somehow referenced inside the `main()` function of `index.ts`.

{% hint style="warning" %}
**📔 Note**: If you have VS Code or Cursor installed but the **CODE** button doesn't open it, it may be that VS Code is not properly configured on your machine to open via the command line. In most cases, this is handled as part of the default installation, but in case it's not, see [these instructions from VS](https://code.visualstudio.com/docs/setup/mac#_launching-from-the-command-line) to enable VS Code from the command line.
{% endhint %}

If you have a preview window open running your scene, whenever you change the code in your files and save, the scene reloads automatically with your changes.

## Using AI

You can leverage AI assistants like Cursor or Claude Code to help you write scene code. For example to use Cursor, do this:

1. Open the Cursor AI assistant by clicking the **AI** button in the top-right of the screen
2. There you can prompt the AI assistant to help you write code. Your prompts can include links to docs pages, paths to specific files in your project, or even images. You can also select a specific model to use from the dropdown.

Decentraland provides a context folder for the AI assistant to help you write code, this context folder is located at `/dclcontext` in your scene project. The AI assistant will know to search this context whenever generating code, to get familiar with the Decentraland SDK.

This folder is updated with the latest context files every time your scene's dependencies are updated. You can also force update this folder by running the following:

```
npx sdk-commands get-context-files
```

{% hint style="info" %}
**💡 Tip**: You can also add your own context files to this folder to help the AI assistant understand your scene and project. If you do, make sure to add them to a new file in that folder, as the default files are overwritten when SDK updates happen.
{% endhint %}

{% hint style="info" %}
**💡 Tip**: Want to go further with AI? You can install Decentraland skills into your preferred AI coding agent to scaffold entire scenes, add multiplayer, deploy, and more — all from plain language prompts. See [Vibe Coding with AI](/creator/scenes-sdk7/getting-started/vibe-coding) for the full guide.
{% endhint %}

## Version control

We recommend that you create a repo for your project on GitHub, and use it to keep track of your project's versions and to work collaboratively with others.

If you're not familiar with how to do this, see [Quickstart for repositories](https://docs.github.com/en/repositories/creating-and-managing-repositories/quickstart-for-repositories), or use the [GitHub desktop application](https://desktop.github.com/download/) for a simpler UI-based flow.

{% hint style="warning" %}
**📔 Note**: Upload the entire project folder to a GitHub repo, but make sure the `/node_modules` or `/bin` folders and the `package-lock.json` file are all included in the `.gitignore` file, to avoid syncing them. This should be the case if you configure the repo to be of type `node`. These files are all auto-generated, and the content may differ for different machines.
{% endhint %}

## See also

* [Vibe Coding with AI](/creator/scenes-sdk7/getting-started/vibe-coding): build scenes by describing what you want to an AI assistant.
* [Smart items - Basics](/creator/scene-editor/interactivity/smart-items)
* [Smart items - Advanced](/creator/scene-editor/interactivity/smart-items-advanced)
* [States and conditions](/creator/scene-editor/interactivity/states-and-conditions)
* [Making any item smart](/creator/scene-editor/interactivity/make-any-item-smart)
* [SDK Quick start](/creator/scenes-sdk7/getting-started/sdk-101): follow this mini tutorial for a quick crash course.
* [Development workflow](/creator/scenes-sdk7/getting-started/dev-workflow): read this to understand scene creation from end to end.
* [Examples](https://studios.decentraland.org/resources?sdk_version=SDK7): dive right into working example scenes.


# Reference items in code

Reference items in your code by name or by tag.

You can reference items that are added via the Creator Hub drag-and-drop interface in your code. This is useful to add sophisticated behavior to those items, or to reference them from other parts of your code.

## Fetch by name

When using the Creator Hub and adding entities by dragging them into the canvas, each entity has a unique name. Use the `engine.getEntityOrNullByName()` function to reference one of these entities from your code.

Use the `EntityNames` enum to easily access the names of the entities that you added via the Creator Hub, or write the name as a string as written on the scene's entity tree view in the Scene Editor.

```ts
import { EntityNames } from '../assets/scene/entity-names'

function main() {

	// Use the EntityNames enum
	const door1 = engine.getEntityOrNullByName(EntityNames.Door_1)

	// Write the name as a string
	const door2 = engine.getEntityOrNullByName('Door 2')

	// Ensure both doors exist in the scene
	if (door1 && door2) {
		// 
	}

}
```

![](/files/HPVzolX6xrirP44aFMg2)

The `EntityNames` enum contains the full list of entities added by the Creator Hub and is updated immediately as soon as you make any changes. If you import `EntityNames.` into your code, your IDE will present you with a dropdown including all the names of the entities available.

![](/files/cceuHfmCYAfZtPsvXYOp)

You can also use the `engine.getEntityByName<EntityNames>()` function, passing `<EntityNames>` as a [TypeScript generic](https://www.typescriptlang.org/docs/handbook/2/generics.html), to validate that an entity by that name really exists in your scene. If the referenced entity is renamed on the Creator Hub, this method will warn you with an error. As the output of this function can't be `null`, you can avoid checking that the entity exists.

```ts
import { EntityNames } from '../assets/scene/entity-names'

function main() {

	const door1 = engine.getEntityByName<EntityNames>(EntityNames.Door_1)

	// No need to check for null
	console.log(Transform.get(door1).position.x)

}
```

{% hint style="warning" %}
**📔 Note**: Make sure you only use `engine.getEntityOrNullByName()` and `engine.getEntityByName()` inside the `main()` function, in functions that run after `main()`, or in a system. If used outside one of those contexts, the entities created in the Scene Editor may not yet be instanced.
{% endhint %}

Once you fetched a reference to an entity with any of the above methods, you're free to perform any action with it, like add or remove components, modify values of existing components, or even remove the entity from the engine.

```ts
import { EntityNames } from '../assets/scene/entity-names'

function main() {
	// fetch entity
	const door = engine.getEntityOrNullByName(EntityNames.Door_3)
	// verify that the entity exists
	if (door) {
		// add a pointer events callback
		pointerEventsSystem.onPointerDown(
			{
				entity: door,
				opts: { button: InputAction.IA_PRIMARY, hoverText: 'Open' },
			},
			function () {
				// open door
			}
		)
	}
}
```

All the entities added via the Scene Editor have a `Name` component, you can also iterate over all of them like this:

```ts
function main() {
	for (const [entity, name] of engine.getEntitiesWith(Name)) {
		console.log({ entity, name })
	}
}
```

## Fetch by Tag

You can also fetch entities by their tags. Tags are a way to group entities together, and are useful to identify entities that have the same purpose or behavior.

Add Tags to an entity via the **Tags** section at the top of the item's properties panel. You can pick from the generic tags like **Tag Group 1** through to **Tag Group 4**, or create your own with a more specific name.

![](/files/qcqUFCmSmp0Ev7kWx5HX)

{% hint style="info" %}
**💡 Tip**: A single entity can have multiple tags assigned to it.

<img src="/files/tMxxQHjT2LujY1z0Q1PC" alt="" data-size="original">
{% endhint %}

You can then fetch all entities that have a specific tag by using the `engine.getEntitiesByTag()` function. This is ideal for when you want to iterate over a group of entities that have the same purpose or behavior.

```ts
import { engine } from '@dcl/sdk/ecs'

export function main() {
	const taggedEntities = engine.getEntitiesByTag('myTag')
  
	for (const entity of taggedEntities) {
      // Do something with each entity
    }
}
```

You can also add or remove tags to an entity from your code. This is useful if you want to change tags based on some logic, or to spawn entities dynamically that have specific tags.

```ts
import { Tags } from '@dcl/sdk/ecs'

Tags.remove(entity, tagName);
Tags.add(entity, tagName);
```

## Fetch all the children of an item

Once you have a reference to a particular item, you can fetch all of the items that are grouped as its children on the entity tree on the left of the screen. The following script fetches the parent entity and then iterates over each of its children that have a Transform component. You can then apply any custom logic you want as you iterate over each.

```ts
import { engine, Entity, Transform, Name, getEntitiesWithParent } from '@dcl/sdk/ecs'
import { EntityNames } from '../assets/scene/entity-names'

function main() {
	// get parent entity
	const parent = engine.getEntityByName<EntityNames>(EntityNames.ParentEntity)

	// fetch full list of children
	const children = getEntitiesWithParent(engine, parent)
	for (const child of children) {
   		// process each child entity
	}
}
```

## Smart item triggers

You can detect a smart item's **Trigger events**, and respond to these with custom code. For example, you could place a button smart item, and activate custom code when the button is clicked.

Use `getTriggerEvents` to fetch an object that can handle trigger events on from a particular smart item, then use the `.on()` function of the returned object to subscribe a callback function. This callback function gets executed every time that the trigger event happens.

For example, if a scene has a button with the following generic **On Click** event, you can write the code below to run custom code whenever the button is activated.

![](/files/xAHYxgBLY1LRxF1I0eOn)

```ts
import { engine } from '@dcl/sdk/ecs'
import { getTriggerEvents, getActionEvents } from '@dcl/asset-packs/dist/events'
import { TriggerType } from '@dcl/asset-packs'
import { EntityNames } from '../assets/scene/entity-names'

function main() {
	const restart = engine.getEntityOrNullByName(EntityNames.Restart_Button)
	if (restart) {
		const restart_event = getTriggerEvents(restart)
		restart_event.on(TriggerType.ON_CLICK, () => {
			// restartGame()
		})
	}
}
```

You can similarly subscribe to any other type of trigger events, like **ON\_PLAYER\_ENTERS\_AREA**, **ON\_SPAWN**, **ON\_TWEEN\_END**, etc.

## Smart item actions

You can detect the activation of a smart item's **Actions**, and respond to these with custom code. For example, you could place a door smart item, and run custom code whenever the **Open** action gets called.

Use `getActionEvents` to fetch an object for handling the actions of a specific smart item. Then you can use the `.on()` function of the returned object to subscribe a callback function. This callback function gets executed every time that the action happens, regardless of if the action was activated by another smart item, or even by custom code of your own.

For example, if a scene has a door with the following default **Open** action, you can write the code below to run custom code whenever the door is opened.

![](/files/rAQPXwrZeVhkPKtgWEoK)

```ts
import { engine } from '@dcl/sdk/ecs'
import { getTriggerEvents, getActionEvents } from '@dcl/asset-packs/dist/events'
import { TriggerType } from '@dcl/asset-packs'
import { EntityNames } from '../assets/scene/entity-names'

function main() {
	const door = engine.getEntityOrNullByName(EntityNames.Wooden_Door)
	if (door) {
		// detect actions
		const actions = getActionEvents(door)
		actions.on('Open', () => {
			console.log('Door opened!!')
			// custom code
		})

		// detect triggers
		const triggers = getTriggerEvents(door)
		triggers.on(TriggerType.ON_CLICK, () => {
			console.log('Door clicked!!')
			// custom code
		})
	}
}
```

You can also emit action events from your code, this allows you to take advantage of actions that are already defined inside the smart item's Action component. The following snippet calls the "Open" action on a door smart item whenever a button smart item is triggered.

```ts
import { engine } from '@dcl/sdk/ecs'
import { getTriggerEvents, getActionEvents } from '@dcl/asset-packs/dist/events'
import { TriggerType } from '@dcl/asset-packs'
import { EntityNames } from '../assets/scene/entity-names'

function main() {
	const button = engine.getEntityOrNullByName(EntityNames.Red_Button)
	const door = engine.getEntityOrNullByName(EntityNames.Wooden_Door)
	if (button && door) {
		// references to actions and triggers
		const buttonTriggers = getTriggerEvents(button)
		const doorActions = getActionEvents(door)

		// detect triggers on button
		buttonTriggers.on(TriggerType.ON_INPUT_ACTION, () => {
			// open door
			doorActions.emit('Open', {})
		})
	}
}
```

{% hint style="info" %}
**💡 Tip**: If you're not trying to do something very complicated, instead of writing code you can also create a custom smart item to handle the actions you want to perform. See [Making any item smart](/creator/scene-editor/interactivity/make-any-item-smart).
{% endhint %}

## Other smart item components

Smart items can include special components that are part of the asset-packs library, like `States` or `Counter`. These components are not part of the Decentraland SDK, but they can be fetched via the `getComponents()` function from the library. You can then read or write values to these components from your scene's code, to have an even tighter integration between smart item behavior and code.

The example below reads and logs the value of a State component of a chest smart item, whenever the chest's actions are triggered.

```ts

import { engine } from '@dcl/sdk/ecs'
import { getComponents } from '@dcl/asset-packs'
import { getTriggerEvents } from '@dcl/asset-packs/dist/events'
import { TriggerType } from '@dcl/asset-packs'
import { EntityNames } from '../assets/scene/entity-names'


export function main() {

    const chest = engine.getEntityByName<EntityNames>(EntityNames.chest)
 
    if (chest) {

        const chestTriggers = getTriggerEvents(chest)

        chestTriggers.on(TriggerType.ON_INPUT_ACTION, () => {
            const { States } = getComponents(engine)
            let state = States.getMutableOrNull(chest)?.currentValue
            console.log( "chest new state ", state)
        })
    }
}
```


# Using the Script Component

Use the Script component to give code functionality, without the need to dig into the whole project structure.

With the new Script Component, it's possible to create Entities that execute custom code from within the entity itself.

Script Components allow the execution of an Entity's custom behaviour without the need to work directly on the `index.ts` and potentially other files.

## Setting up the Script Component

1. Add the Script Component to an Entity by clicking on the `+` button and select it. Create a new Script by clicking on **+ Add New Script Module** and choose a name, or using the File Path (browse or drag and drop an existing file).

![](/files/J9Kr0SFYi4QUNMtcL9um)

2. Click on the CODE button in the component to open the default code editor. Let's check its structure. For more details on how to select and manage your default editor, please go to [Combine with code](/creator/scene-editor/extend-with-code/overview).

## Understanding the Script structure

When the Script is first opened, it has the following code:

```ts
import { engine, Entity } from '@dcl/sdk/ecs'
import {} from '@dcl/sdk/math'

export class BuildingScript {
  /**
   * Properties
   * Define class fields you want to reuse across methods.
   * Example usage: this.myVariable
   */
   // private myVariable: boolean = true

  /**
   * Constructor / Inputs
   * Parameters declared here appear in the Script component UI in Creator Hub.
   * Supported types: Entity, String, Number, Boolean, ActionCallback.
   *
   * Note: After editing this file, click the refresh icon in the Script component UI
   * to see updated inputs.
   *
   * The `src` and `entity` fields in the constructor are required by internal references.
   */
  constructor(
    public src: string,     // DO NOT REMOVE
    public entity: Entity,   // DO NOT REMOVE
    // Add your custom inputs below
  ) {}

  /**
   * start()
   * Called once when the script is initialized.
   */
  start() {
    // Script initialization
    console.log("BuildingScript initialized for entity:", this.entity);
  }

  /**
   * update(dt)
   * Called every frame.
   * @param dt - (optional) Delta time since last frame (in seconds)
   */
  update(dt: number) {
    // Called every frame
  }
}
```

The class is composed of three main parts:

* The **constructor**,
* the **start()** method
* the **update()** method.

## Constructor

The constructor contains the parameters you want to expose and modify dynamically from your scene in Creator Hub.

```ts
export class BuildingScript {
  constructor(
    public src: string,
    public entity: Entity,
    public numericVariable: number, 
  ) {}
...
}
```

Once the file is saved, the **Refresh** button in the Script Component updates all changes done.

<img src="/files/a4ThERIIrKfO8e2VpYnm" alt="Refresh button" width="360">

Once refreshed, the Script Component now shows the `numericVariable` added in the code.

![](/files/zwIc6RAQbCHA2MjkUgc2)

## Parameters

If different Entities use the same file in the Script component, each still have independent parameters: if the scene has two buildings, `building1` and `building2`, both with a Script Component pointing at `BuildingScript.ts` file, each building has it's own `numericVariable` parameter that can be modified independently.

{% hint style="warning" %}
**Important Note**: Don't modify/delete `public src: string` and `public entity: Entity`. You can add new inputs following these.
{% endhint %}

The allowed types for the constructor parameters are:

* `Entity`
* `string`
* `number`
* `boolean`
* `ActionCallback`

{% hint style="info" %}
**📔 Note**: Both `public` and `private` constructor parameters are exposed to Creator Hub. The `private` keyword only restricts access within the `BuildingScript` class. For more details, see the official TypeScript documentation on\
[Parameter Properties](https://www.typescriptlang.org/docs/handbook/2/classes.html#parameter-properties).
{% endhint %}

### Accessing Parameters inside the Script

To access a parameter's value from your code, use the notation `this.definedParameter`. For example, `this.numericVariable` or `this.entity`.

The default Script template includes this line in the start() method:

`console.log("BuildingScript initialized for entity:", this.entity);`.

Change it like this to log the value of a value that you defined in the constructor:

`console.log("BuildingScript initialized with numericVariable:`, `this.numericVariable);`

Note that when you change the parameter's value in the Creator Hub UI, you should also see this logged value reflect that.

### Default parameters

The constructor by default contains an `src` and an `entity` parameter, these are very useful for the code in your script:

* `this.entity` always refers to the entity that holds the `Script` component, use this to access info about the entity or add components to it.
* `this.src` is the path where the script is stored. This is particularly useful when creating Smart Items that are meant to be used by others. Use this field to construct the path to files that are packaged with your smart item, even if the smart item's path changes or is renamed.

```ts
export class BuildingScript {
  constructor(
    public src: string,
    public entity: Entity,
  ) {}

  start() {
    Material.setPbrMaterial(this.entity, {
      texture: Material.Texture.Common({
        src: this.src + '/images/myImage.png',
      })
    });
  }
}
```

The script above fetches the entity that owns the script and applies a texture to it. It obtains the texture from a `.png` file that is packaged in the smart item folder, in a subfolder named `/images`. By using `this.src`, we ensure that the file path is always known, no matter if the smart item is imported to the scene under `/assets/custom/itemName` or `/assets/asset-packs/itemName`

### Tooltips on parameters

Add tooltips to your input parameters, so that users know what these fields are used for, or what values are accepted. Users will see a tooltip icon next to each field in the Script component UI, and are able to read custom text when hovering over the icon.

To add tooltips to your constructor, add a commented out block right before the constructor, and write a line with `@param` plus the name of the field, followed by a description, for each tooltip.

```ts
  /**
   * @param startDate - The start date of the event in YYYY-MM-DD format
   * @param yOffset - How many meters above the ground to display the item
   */
  constructor(
    public src: string,
    public entity: Entity,
    public startDate?: string,
    public yOffset: number = 0.5,
  ) {
  }
```

You may need to click the refresh icon on the Script component UI to see changes in your tooltips.

<img src="/files/a4ThERIIrKfO8e2VpYnm" alt="Refresh button" width="360">

## start() & update() Method

The **start()** method contains code that is executed only once, when the Entity is created (in this case, when the scene first loads).

Preview the scene and check the logs (**Tip**: you can use the `` ` `` shortcut): It displays the new message including the `numericVariable` parameter.

![](/files/wfo6v6k84QDfvjKahMS3)

The **update()** method, on the other hand, executes its code every frame of the game (as Systems do). For example, checking values of the `PlayerEntity` to trigger behaviours in the script.

The following code prints Logs every frame of the game that the `PlayerEntity` is higher than the previously defined `numericVariable`, that is provided by the creator dynamically from the Script Component UI.

```ts
update(dt: number) {
    if (Transform.get(engine.PlayerEntity).position.y > this.numericVariable ) {
      console.log("The player's height is over ", this.numericVariable);
    }}
```

<img src="/files/P2j2xdbu85UyDBjm4q8W" alt="Update Method" data-size="line">

The first log belongs to the start() method, indicating that we set numericVariable. The second one belongs to the update() method, when the player is higher than that value.

## Exposing Actions to the Creator Hub

It is possible to define an `Action` inside a Script Component script and have it accessible on the Creator Hub's UI. This enables the possibility to trigger this `Action` with another Entity.

```ts
  /**
   * Expose this action to be triggered
   * @action
   */
  exposedAction(creatorHubParameter: number) {
    console.log("Triggered from another entity using parameter: ", this.creatorHubParameter);
  }
```

`creatorHubParameter` will be exposed as an `Action` parameter to give it a custom value. After refreshing the Script Component, the new action will be available as an option for the Actions dropdown.

![](/files/i0R7AR1arRvPugEu40eD)

After adding the Action, any Entity in the Creator Hub can trigger it using `Triggers`

![](/files/BrQYFdaYjc1ThCki5M1w)

{% hint style="info" %}
**📔 Note**: You can add as many Actions as needed inside the Script. All of them will be accessible independently from the `Action` dropdown.
{% endhint %}

## Calling Script methods from Outside

To call a Script method from another Script or from `src/index.ts`, the following steps should be followed:

1. Create a `public` method inside the Script class.
2. Run `npm run build` from the scene's root directory.
3. From the file where you want to use the public method, add `import { callScriptMethod } from '~sdk/script-utils'`.
4. Call `callScriptMethod` with the parameters needed (in this case, `someParamter`).

Here's an example with a `public` method exposed

```ts
export class BuildingScript {
  constructor(
    public src: string,
    public entity: Entity,
    ...,
  ) {}

  public publicMethod(boolParameter: boolean, someNumberParameter: number) {
    if (boolParameter) {
      console.log("Public method called with parameter true!: ", someNumberParameter);
    } else {
      console.log("Public method called with parameter: false!", someNumberParameter);
    }
  }
...
}
```

To call it from `src/index.ts`, use:

```ts
import { callScriptMethod } from '~sdk/script-utils'


export function main() {
    const buildingEntity = engine.getEntityOrNullByName("building")
    if (buildingEntity) {
        const scriptMethod = callScriptMethod(
            buildingEntity,
            "assets/scene/Scripts/BuildingScript.tsx",
            "publicMethod",
            false,
            3,
        )

        scriptMethod
    }
}
```

First, the `main` function looks for the `Entity` that has the Script component. Second, if the `Entity` exists, `callScriptMethod` is called with the following parameters:

1. `entity`: `Entity` that has the `public` method.
2. `scriptPath`: `path` where the `Script` class lives.
3. `methodName`: name of the `public` method to be called.
4. `...args`: Arguments of the method. In this case, there are two. They should be added in order, one after the other.

Third, we call the defined `callScriptMethod`, in this case, `scriptMethod`.

With the parameters' values given, the output is:

![](/files/Ym8oP76z2UL2bRT3C7wF)

{% hint style="info" %}
**📔 Note**: You can follow the same logic to call a `public` Script method from another script or file. You can use it to fetch or change values from `public` variables in the Script class.
{% endhint %}

## Triggering other Entities' Actions from a Script

It is possible to use a parameter of type `ActionCallback` in the Script class constructor. This allows triggering another `Entity`'s `Action` defined through the Creator Hub UI from the Script's methods.

In this example, `anotherEntityAction` is added as a `public` parameter.

```ts
export class BuildingScript {
  constructor(
    public src: string,
    public entity: Entity,
    public anotherEntityAction: ActionCallback,
    ...,
  ) {}
  ...
}
```

A selectable `Entity` and `Action` are now available when the Script Component is refreshed in the Creator Hub UI. `Sphere` is an already existing Entity in the scene that has an action called `Scale`.

![](/files/Onj0ttppvlDzGu7wyeLj)

The action from the other Entity is now accessible on the Script class. It could be used in many different ways. In the following example, pressing E will trigger `this.anotherEntityAction` by defining a `pointerEventsSystem` in the `start` method.

```ts
  start() {
    pointerEventsSystem.onPointerDown(
      {
        entity: this.entity,
        opts: {
          button: InputAction.IA_PRIMARY,
          hoverText: "Press E to trigger an Action from another Entity.",
        },
      },
      () => {
        this.anotherEntityAction();
      }
    );
  }
```

{% hint style="info" %}
**📔 Note**: Combining exposing and triggering `Actions` is a very powerful tool. You can define a Script Component on one Entity, expose an action using a `public` method, and then triggering it from another Entity's Script Component using an `ActionCallback` parameter.
{% endhint %}

## See also

* [Smart items - Basics](/creator/scene-editor/interactivity/smart-items)
* [Smart items - Advanced](/creator/scene-editor/interactivity/smart-items-advanced)
* [States and conditions](/creator/scene-editor/interactivity/states-and-conditions)
* [Making any item smart](/creator/scene-editor/interactivity/make-any-item-smart)
* [SDK Quick start](/creator/scenes-sdk7/getting-started/sdk-101): follow this mini tutorial for a quick crash course.
* [Development workflow](/creator/scenes-sdk7/getting-started/dev-workflow): read this to understand scene creation from end to end.
* [Examples](https://studios.decentraland.org/resources?sdk_version=SDK7): dive right into working example scenes.


# Configure

Configure scene settings and properties


# Scene Settings

Edit your scene's metadata

Click the **Pencil icon** on the top-right of the screen. This opens a series of scene-level properties to edit.

![](/files/VvT6JowMryTc0ZoPnP5v)

Here you can configure multiple properties including title and thumbnail, scene size, scene categories, and feature toggles.

See [Scene Metadata](/creator/scenes-sdk7/kinds-of-projects/scene-metadata).

## Scene details

The **Details** tab lets you configure several fields about your scene. These fields are shown to players that might visit your scene, for example when expanding the location on the map, when being prompted to teleport, or when sharing a link to the scene on social media. Make sure you make the information here attractive and accurate to drive more traffic to your scene!

![](/files/RLr7T8vJS1rRYoFczdRb)

The following fields are available:

* **Name**
* **Description**
* **Thumbnail**

  <div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><p><strong>💡 Tip</strong>: If no thumbnail is provided, it uses the automatic capture you see on the scene's card. We recommend uploading a more attractive image</p></div>
* **Categories**
* **Creator name** (optional)
* **Creator contact email** (optional)
* **Creator wallet address** (optional)

The thumbnail should be a .png image of a recommended size of 228x160 pixels. The minimum supported size is 196x143 pixels. The image may be stretched if the width-to-height proportions don’t match 228x160.

See [scene metadata](/creator/scenes-sdk7/kinds-of-projects/scene-metadata) for more details on these fields.

{% hint style="warning" %}
**📔 Note**: The scene's **Age Rating** is not edited on this panel. You can set the `rating` field directly in the `scene.json` file, or, for scenes published to a World, change the **Content Rating** in the Creator Hub's World Settings after publishing. Decentraland is an 18+ platform, so the rating to set is `A` for Adults. See [Age Rating](/creator/scenes-sdk7/kinds-of-projects/scene-metadata#age-rating).
{% endhint %}

### Tipping

You can receive tips from players who visit your scene. To enable tipping, got to the **Details** tab on the scene settings and provide an Ethereum address under **Creator wallet address**.

![](/files/4gZ5RJM3reMq9FtudYIj)

When a player visits your scene, they will see a piggy bank icon on the top-left of the screen. Clicking on it opens a modal where they can send you a tip. This menu can also be accessed by opening your scene's info on the map.

![](/files/fz7BuCw0ezgu42fOinCA)

The tip modal allows the player to select the amount of MANA they want to send. The player must own MANA in their wallet to send a tip. If the address you provided is linked to a Decentraland NAME, this modal will show the name of the wallet owner besides the Ethereum address.

![](/files/3zri7syvfDinrHWit208)

You will receive a notification on the Decentraland notifications tab whenever a player sends you a tip.

## Layout

You can edit the size of your scene by clicking the *pencil icon* and then changing the number of rows and columns.

Scenes in Decentraland occupy one or several adjacent LAND parcels. Each LAND parcel measures 16x16 meters.

Set the number of parcels for the rows and columns and click **Apply layout** for it to affect how your scene looks on the Scene Editor canvas.

![](/files/b2Yr4sin0QdWk08pXEaT)

To build something to deploy to LAND parcels you own, make sure the shape of the scene matches the shape of where you want it deployed.

{% hint style="info" %}
**💡 Tip**: You can toggle each tile on the grid off by clicking on it. This allows you to draw non-rectangular shapes for your scene layout.

<img src="/files/siAygwUcfzfw64l5qbQO" alt="" data-size="original">
{% endhint %}

If you own a Decentraland NAME, you can also deploy your scene to a [Decentraland World](/creator/scenes-sdk7/publishing/publishing-options#decentraland-worlds). In that case, you can use any layout of up to 300x300 parcels without needing to own them, but you will have a size limit in MB.

See [Kinds of project](/creator/scenes-sdk7/kinds-of-projects/kinds-of-project) to better understand the different options.

### Advanced view

You can also click the **Set Coordinates (Advanced)** button to manually list the coordinates of your scene.

![](/files/DkIAN5wbDZmtICPEFnrQ)

In **Custom Coordinates**, write the coordinates of each of the parcels where you wish to publish. Separate the x and y coordinate with a comma, and each set of coordinates separated by spaces. Remember that these coordinates must all be adjacent to be valid. For example:

`78,-2 79,-2 78,-3 79,-3`

In the **Origin Point** field, define which of the coordinates in the scene should be treated as the point of origin. This has to be one of the coordinates you listed in the **Custom Coordinates** field. It's recommended to set the parcel on the bottom-left of the scene.

## Scene restrictions

You can disable certain functionalities on your scene if you chose, in case they might be abused or clash with the kind of experience you want to create.

![](/files/zJiF5KxKQfAglSuSN83P)

* **Silence Voice Chat**: Prevent players on your scene from using voice chat.
* **Disable Nearby Voice Chat**: Prevent players on your scene from using the nearby (proximity-based) voice chat.
* **Disable Smart Wearables & Portable Experiences**: Prevent players from using [Smart Wearables](/creator/scenes-sdk7/kinds-of-projects/smart-wearables) or [Portable Experiences](/creator/scenes-sdk7/kinds-of-projects/portable-experiences).

## Skybox Control

You can control the skybox time of day in the **Settings** tab. You can set a fixed time of day for your scene. All players will see the scene with this time of day, and the skybox will not follow the day/night cycle.

In the Creator Hub, open the scene settings and click on the **Settings** tab to find the **Skybox** section. Uncheck the **Auto** option to avoid using the day/night cycle and set the time of day you want.

![](/files/TgDVRuEy2UWnEohW6jTK)


# Publish

Publish your scene to Decentraland


# Publish a Scene

How to publish your scene to LAND or a NAME.

## Before you begin

Make sure of the following:

* Your scene complies with all of the [scene limitations](/creator/scenes-sdk7/optimizing/scene-limitations). Most of these are validated each time you run a preview of your scene.
* You have a [Metamask](https://metamask.io/) account, with your LAND parcels or NAME assigned to it.
* You own the necessary amount of adjacent LAND parcels or a Decentraland NAME. Otherwise you can purchase LAND in the [Marketplace](https://decentraland.org/marketplace/) or a NAME in the [Builder](https://decentraland.org/builder/names).

{% hint style="warning" %}
**📔 Note**: Multi-parcel scenes can only be deployed to adjacent parcels.
{% endhint %}

Check your [scene's details](/creator/scene-editor/configure/scene-settings#scene-details), make sure you provide an appealing name, description, thumbnail, categories, etc.

{% hint style="danger" %}
**❗Warning**: When planning live events, make sure you don't make last minute changes to the scene right before the event.

After each publish, an internal process optimizes all 3D models before they can be rendered. This takes around 15 minutes. If you visit the scene before this is done, the scene may appear broken. This process runs even if the 3D models were all previously published.
{% endhint %}

## Publish your scene

To publish your scene:

1. Open your scene in the Scene Editor and click **Publish**. This opens a window showing details about the publication.
2. Select if you want to publish to LAND or to a WORLD. See [Kinds of projects](/creator/scenes-sdk7/kinds-of-projects/kinds-of-project) to better understand the different options.

![](/files/hpD6e4FEnJNaSxr9dt9Q)

3. If publishing to LAND, select the location on the map. You'll see your eligible parcels marked in red. If publishing to a WORLD, you'll see your eligible NAMEs in a dropdown.

{% hint style="info" %}
**💡 Tip**: If you don't see your parcels or NAMEs, make sure you're connected to the Creator Hub using the right user account. Otherwise exit the project and click the user settings icon on the top-right corner, then select **Sign Out** and sign back in again.
{% endhint %}

4. The next screen shows all of the files you're currently uploading and their sizes, confirm the operation.
5. The publication process will then start. Stages **1** and **2** are necessary for your scene to be playable, once done a **Jump In** button appears. You don't need to wait for **Stage 3** to try out your scene. ![](/files/ong4VUMnXCtgTMbPYAMd)

{% hint style="info" %}
**📔 Note**: The three stages of the deployment involve:

* **1. Uploading**: Uploading the files to the servers.
* **2. Converting**: The scene's 3D models are compressed into Asset Bundles for faster rendering. This may take 15 minutes or less. It may delay more for very large scenes, or if the servers are currently busy converting other scenes.
* **3. Optimizing**: Low Level of Detail (LOD) versions of your assets are generated. These are only used to render your scene from far away, meaning you don't need to wait for this to finish to jump in and test your scene.
  {% endhint %}

## Managing Worlds

The Creator Hub enables World management via the **Manage** tab in its main panel. The **Manage** tab allows World tracking and editing. From here, you can edit World Settings, Permissions, and Scenes.

### World storage budget

Scenes published to Worlds count against a storage budget that is shared across all the Worlds owned by your wallet. The budget grows with your holdings: each Decentraland NAME or LAND parcel you own grants 100 MB, and every 2,000 MANA held in your wallet grants an additional 100 MB. Worlds published to ENS domains have a fixed limit of 36 MB instead.

The **Manage** tab shows how much of your storage budget you're using. Click **View Details** to see how your MANA, LAND, and NAME holdings add up.

<img src="/files/ZFskR76QGjfb3dFEd656" alt="" width="300">

You can also check your remaining budget in the **Worlds** tab of the [Builder](https://decentraland.org/builder/worlds).

See [Worlds size limits](/creator/scenes-sdk7/kinds-of-projects/kinds-of-project#size-limits) for details on how the budget is calculated and what happens if you exceed it.

### World Settings

A World Owner can edit its settings by going into the desired World **Settings** under the **Manage** panel, or by accessing it during the publishing process by clicking on **Settings** if **Multi-Scene World (Advanced)** is enabled.

<img src="/files/n50VjY51HkGdziAllIpo" alt="" width="600">

* **Details**: World's general information:
  * World Title
  * Description
  * Content Rating
  * Categories

The information added in **Details** will be shown in Decentraland Places and in the in-world World information once it is published.

* **Layout**: Only accessible in Multi-Scene Worlds. Contains information about all the World's published scenes.
  * Remove individual scenes by clicking the three dots and selecting **Remove from World**.
  * **World Map** shows the World layout and identifies parcels with content and the remaining free parcels.

<img src="/files/Gp08AjYTuzCHfdd8x7nV" alt="" width="600">

* **Misc**: Other useful World configurations:
  * World Spawn Coordinate: This sets up the Parcel (X,Y) in which the user will spawn inside the World. The scene located in that Parcel determines the exact position the user will spawn (for example, Parcel 1,1 is the World Spawn, and the scene in 1,1 has a Spawn point of 1,0,1 **inside that scene**).
  * Skybox settings

{% hint style="info" %}
**📔 Note**: World Settings are only accessible to the World Owner (the address that minted the NAME). For more details about how to obtain a NAME, check the [Marketplace NAMEs section](https://decentraland.org/marketplace/names/claim).
{% endhint %}

### Multi-Scene Worlds

A World can have multiple scenes, published by the World Owner or by other creators. This enables a collaborative environment where each parcel can be managed by different Collaborators.

#### Making a World Multi-Scene

A World Owner can choose to make the World Multi-Scene by toggling **Multi-Scene World (Advanced)** when publishing to a single-scene World.

<img src="/files/ozxfmxinXHT0pNkZj8jL" alt="" width="600">

Once the Multi-Scene World is published, the World Owner can publish additional scenes or add Collaborators to publish within the World.

{% hint style="info" %}
**📔 Note**: A Multi-Scene world size adapts automatically to contain all the published scenes, growing and shrinking dynamically on each publish. The space left between different scenes in the Multi-World is filled with environment.
{% endhint %}

#### Adding Collaborators to a Multi-Scene World

In the **Manage** panel, a World Owner can access the World's **Permissions** by clicking on the three dots. The World Owner can manage collaborators under the **Collaborators** tab.

<img src="/files/CsJGCf3BVwBkhsU35Xc8" alt="" width="600">

A Collaborator can have deploy rights to All Parcels or to specific Custom Coordinates. Custom Coordinates can be selected and confirmed through an interactive World map, similar to the one in the World Settings.

<img src="/files/54XQoy7fjalAkCfEy8yq" alt="" width="600">

#### Deploying to a Multi-Scene World as a Collaborator

World Collaborators cannot edit its Settings or Permissions. In the **Manage** tab, a creator can see the World they are a Collaborator in but cannot access **Settings** or **Permissions**.

<img src="/files/aPlrjJOXuQtLVCmKxQQz" alt="" width="600">

When going through the publishing process, the creator can select to publish only to the parcels they are a Collaborator in (as set by the World Owner).

In the **Collaborators** section, if the World Owner set **Custom Coordinates** for the creator, only the assigned parcels will be available for publishing. If access was set to **All Parcels**, the creator will be able to select any parcel in the World to publish their scene.

{% hint style="warning" %}
**📔 Note**: Collaborators with **All Parcels** publishing access can overwrite any scene from the world, even if it was published by the owner or other collaborators.
{% endhint %}

<img src="/files/1oEu2rES7v8YwExJ6MAE" alt="" width="600">

### Private Worlds

A WORLD can have different **Access** settings. It can be accessible to anyone, or be restricted in different ways.

#### Setting the Access of a WORLD

In the **Manage** panel, a World Owner can access the World's **Permissions** by clicking on the three dots. The World Owner can manage access restrictions under the **Access** tab.

**Access Types**

A World Owner can choose between three types of **World Access**:

**Public**

Anyone can access the World. This is the default setting of a World.

**Password Protected**

Only users with the password can enter the World.

Passwords must be at least 8 characters long and contain at least 2 numbers. Once created, the password won't be accessible, so make sure to keep a copy.

**Invitation Only**

Only addresses and Communities added in the **Approved Addresses** can access the World.

To add new addresses or communities to the **Approved Addresses**, follow these steps:

1. Click on the **+ New Invite** button.
2. You can add addresses in three different ways:

* **Wallet Address**: Add individual wallets, one at a time.
* **Community**: Search and add any Public Community. This adds **all Community addresses** to the **Addresses Approved**.

  <img src="/files/bXAkEY0eW0zpqd9NUzPN" alt="" width="600">
* **Import CSV**: Use an existing CSV with a list of addresses or community IDs to add to **Approved Addresses**. The structure is one wallet per line, for example:

```
0x3bA7fD92eC4a1F6B8d2E9c5A7b1D3f6C8e4A2d9F
0xA1c9E4b7D2f6C8a3B5e9F1d4A7c2E6b8D3f9C5a1
```

Once imported, it tracks each Address individually, as shown in the image.

<img src="/files/3nfbQbDjHkwyBZgc0GvN" alt="" width="600">

3. After confirming, the address/es are in the **Approved Addresses**.
4. With a new **+ New Invite**, addresses are added to the existing list, helping the World Owner manage and extend the list if needed.

<img src="/files/QBMBe7v1BZCcc9Z4JGVA" alt="" width="600">

5. Individual Addresses or set of Addresses (in case of a Community) can be removed by selecting **Delete** on the three dots in the **Approved Addresses** section.

{% hint style="warning" %}
**📔 Note**: If you change the **Access** type from **Invitation Only**, your **Approved Addresses** list will be removed. Make sure to have a copy in case you need it in the future.
{% endhint %}

#### Jumping into Private Worlds

There are different scenarios if a user jumps into a World that doesn't have **Public** access:

* Their address in the **Approved Addresses**: Will be able to join normally. If not, they will get information that the World is **Invitation Only**.

<img src="/files/xHUxZ0GaVnl1znvaZvcW" alt="" width="300">

* The World is **Password Protected**: Users will be able to write the password. The maximum limit is ten (10) attempts.

<img src="/files/1Z8yzpgeCRTgv5UGdXcp" alt="" width="300">

## Publish from a hardware wallet

Instead of storing your LAND tokens in a Metamask account, you may find it more secure to store them in a hardware wallet device, such as a [Ledger](https://www.ledger.com/) or a [Trezor](https://trezor.io/), that's physically plugged in to your computer.

If you're using one of these devices, you can link the hardware wallet to Metamask to enable signing messages, while keeping the tokens more secure. See [this article from Metamask](https://support.metamask.io/more-web3/wallets/how-to-connect-a-trezor-or-ledger-hardware-wallet/) for instructions to connect your account.

Once your hardware wallet can be used via Metamask, you can deploy following the same steps as if your tokens were on a Metamask account.

## Scene overwriting

When a new scene is deployed, it overwrites older content that existed on the parcels it occupies.

If a scene that takes up multiple parcels is only partially overwritten by another, all of its parcels are either overwritten or erased.

Suppose you deployed your scene *A* over two parcels *\[100, 100]* and *\[100, 101]*. Then you sell parcel *\[100, 101]* to a user who owns adjacent land and that deploys a large scene (*B*) to several parcels, including *\[100, 101]*.

Your scene *A* can't be partially rendered in just one parcel, so *\[100, 100]* won't display any content. You must build a new version of scene *A* that only takes up one parcel and deploy it to only parcel *\[100, 100]*.

## Publish to granted land

If you're publishing to land owned by the Decentraland Foundation that was granted to you via a grant, click the **Publish** button normally, then select **Publish to a different server** on the bottom. Then select **Custom Server** from the dropdown and enter the following server address: `https://linker-server.decentraland.org`.

{% hint style="warning" %}
**📔 Note**: You must first manually set the coordinates of your scene in the advanced tab of the Layout settings. See [Scene Settings](/creator/scene-editor/configure/scene-settings#layout) for more info.
{% endhint %}

## Custom servers

You can deploy content to a custom server that doesn't belong to the official DAO-maintained network of catalyst servers. To do this, you don't need to own any LAND or NAME tokens, as you can configure the server to use any validation logic you prefer to control who can deploy where. Custom servers can chose to have content from the official servers, that you can overwrite, or start from a blank slate and publish entirely new content.

To publish to a custom server, click the **Publish** button normally, then select **Publish to a different server** on the bottom. Then select **Custom Server** from the dropdown and enter the address of the server.

See [How to run your own Catalyst Node](https://docs.decentraland.org/contributor/tutorials/how-to-run-a-catalyst/) for more info on what you can do with your own server and how to set it up.

{% hint style="warning" %}
**📔 Note**: Players will need to manually type in a URL to access your custom server. Certain validations from services like the [rewards server](/creator/rewards/getting-started) might fail in these contexts, as often these services require that the request comes from an official server.
{% endhint %}

Players are never directed to this server, the only way to access it is to explicitly type in the URL to connect to it.

## Verify deployment success

Once you deployed your scene, these changes will take a few minutes to be propagated throughout the various content servers in the network. If you enter Decentraland right after deploying, you might still see the previous version of your content, or that 3D models are missing entirely.

The Creator Hub displays the progress of the publication as it moves through the **Uploading**, **Converting** and **Optimizing** stages, and shows a **Jump In** button as soon as the scene is playable.

To check how the new version of your content propagates through the servers that make up Decentraland's content network, you can use the [catalyst monitor screen](https://decentraland.github.io/catalyst-monitor/). Each one of these servers refers to a different realm.


# Operate live


# Scene Admin

Scene administrators have special control over what happens in the scene in real time.

Grant certain players the special role of **admin** on your scene.

During a live event, an admin can spontaneously control what happens in the scene from inside Decentraland, without needing to pre-schedule actions or relying on a 3rd party service. Start playing the music when enough of a crowd gathered, drop confetti or make a spaceship appear when the time feels right.

{% embed url="<https://www.youtube.com/watch?v=efjJN7Jr7Qo>" %}

When a scene admin visits your scene, they see a special admin panel on the top-right corner that only they are able to see. The panel uses icon tabs along the top to switch between sections (Video, Announcements, Smart Items, Permissions). Through this UI they can play videos or live streams, send announcements, ban players, or activate any smart item that is configured to be activated like this. These actions are seen by all other players in the scene that are connected to the same comms island as the admin.

![](/files/brnhxLXgyx2lbamkrFrY)

## Setting up admins

To assign admins, you need to add the **Admin Tools** smart item to your scene.

![](/files/6O5voCaAGMA4SdzzPiIR)

{% hint style="warning" %}
**📔 Note**: Update your scene to use the latest dependencies.

<img src="/files/Hi30HLoUd5226tjE1Xcr" alt="" data-size="original">
{% endhint %}

While you're developing the scene and trying it locally, you are always an admin. Once the scene is published, anyone with publish permissions to the scene is also automatically an admin. This includes:

* The owner of the LAND parcels or World NAME where the scene is published
* Anyone who is granted **Operator rights** on these parcels or name. See [Give permissions](https://docs.decentraland.org/player/marketplace/land-manager/#give-permissions).
* Any user renting that land. See [Rentals](https://docs.decentraland.org/player/marketplace/rentals/).

To assign additional admins that don't have publish permission but can do live-ops in the scene:

1. Publish the scene and visit the live version as an admin
2. Open the **Permissions** tab (via the icon tabs at the top of the admin panel).

   ![](/files/CSXkjqLBAXmsVukiQezr)
3. Write the wallet address of the person you want to add next to **Add an Admin** and click **Add**.

You can see who is an admin in the scene by clicking the **View Admin List** button. From this screen you can also **Remove** people from the admin list.

![](/files/rTB3SUSm4FMYjMHWuSZ0)

{% hint style="warning" %}
**📔 Note**: It's only possible to remove the admin role from players that were added manually to the list via the **Permissions & Moderation** tab. Players who are owners, operators, or renters of the scene are displayed on this list but can't be removed from their admin roles from this UI. To remove an admin role from an operator, you must first remove their operator role.
{% endhint %}

Whenever an admin player is in the scene, they will see a special UI on the top-right corner. Non-admin players don't see this UI.

![](/files/brnhxLXgyx2lbamkrFrY)

### Check admin status via code

It is also possible to know if a Player is an Admin of a scene using code. This allows for other behaviors to be available (or not) for a Player, for example, allowing interactions with a specific Entity of the scene.

```ts
import { isAdmin } from "@dcl/asset-packs/dist/admin";

async function onPlayerSpawn() {
  const isAdminUser = await isAdmin();
  if (isAdminUser) {
    // Show admin-only UI, teleport to stage, show entity, etc.
  }
}
```

{% hint style="info" %}
**💡 Tip**: For more information about async functions, see [Async Functions](/creator/scenes-sdk7/programming-patterns/async-functions).
{% endhint %}

## Video playing

One of the most common actions for admins to do is to play videos. The admin panel includes a video player section where they can control anything related to videos.

To enable this, you need to add a **Video Player** smart item to your scene and link it to the Admin Tools smart item.

1. Add a **Video Player** smart item to your scene

   ![](/files/Kz8YR1z4Hft0RdmcX5Le)

   See [Video Screen](/creator/scene-editor/interactivity/video-screen) for more details on how you can configure the default media source and other settings of the Video Player smart item. Most of these configurations can be overriden by the admin once the scene is running.

   <div data-gb-custom-block data-tag="hint" data-style="warning" class="hint hint-warning"><p><strong>📔 Note</strong>: An admin can only manage videos that play on the Video Screen smart item, not on screens added via SDK code.</p><p>You can include as many video screens as you want. In general, avoid having more than one different video playing at the same time, as that hurts performance a lot.</p></div>
2. Open the Admin Tools Smart Item, make sure the **Video Screens** checkbox is enabled for this section to show. Then select the screen from a dropdown list and give it a friendly name to display on the Admin UI. You can add as many Video Screens as you want, each screen is controlled independently.

   <img src="/files/ObUQmntY23Vz8zwMUfTQ" alt="Scene name" width="300">

Once the above is configured, admin users in your scene can open the admin panel and select the video tab (via the icon tabs at the top) to control these video screens.

<img src="/files/OSGIbLamr3tT3c0a74eR" alt="Scene name" width="300">

If your scene has multiple independent video screens, the **Screen** dropdown lets you pick which video screen to control. The list displays the names you gave to each video screen on the Admin Tools smart item configuration.

{% hint style="info" %}
**💡 Tip**: To show the same video on multiple screens that can be controlled as one, see [Multiple Video Screens](/creator/scene-editor/interactivity/video-screen#multiple-video-screens).
{% endhint %}

## Media Sources

A segmented control at the top of the video section lets you switch between three media sources. The currently active source is indicated by a pill label. Switching tabs only shows the settings for that source, it does not interrupt what's currently playing until you click **Activate**.

* **Video URL**: Play a video from a URL. Paste a video URL into the field and click **Activate**. The video will start playing on the selected screen for all players. You can also stop, pause, restart, and adjust the volume.

  <img src="/files/8ZlJCzrImFF9FxwZq8R4" alt="Scene name" width="300">

  <div data-gb-custom-block data-tag="hint" data-style="warning" class="hint hint-warning"><p><strong>📔 Note</strong>: Not any video URL will work. Videos from some sites have strict policies about their content and will block access to them from Decentraland. See <a href="/pages/iyiNK6DnqUfbCnyCrSWe#streaming-from-other-sources">Streaming from other sources</a> for more information on what you can and can't play in Decentraland.</p></div>
* **DCL Cast**: Use Decentraland's free streaming web app to easily share your camera or screen with other players in the scene, no need to set up streaming software. Presentation controls (Previous, Next, Play video, Stop) are shown inline when a presentation is active.

  <img src="/files/KInNHT0zAaNB63DA9t6M" alt="DCL Cast" width="300">
* **Stream**: Play a live stream using Decentraland's free streaming infrastructure and a streaming software like OBS or StreamYard.

  <img src="/files/eRE9c8plLV59tEcnWyTb" alt="Scene name" width="300">

  See [Live Streaming](/creator/scene-editor/operate-live/live-streaming) for more information on how to set up a live stream.

Each media source section includes a **volume slider** that lets you set the volume from 0% (muted) to 100%.

![](/files/NNLZhPZxt3gtVmXgCQbL)

## Announcements

In the **Announcements** tab of the admin panel, admins can write messages that get seen by all players in the scene. Messages like this can only be sent by admins, so other players will perceive them as more legitimate than a message on the chat by someone claiming to be an admin.

Select the Announcements tab of the admin panel. Write a message and click **Share**. The message can be up to 90 characters long. The input field clears automatically after sending, so you can type a new message right away.

![](/files/bX1Q5B7lqRdmmwoEMkvX)

## Ban players

You can ban players from your scene by selecting the **Permissions** tab of the admin panel, writing the name or wallet address of the player you want to ban and clicking the **Ban** button.

![](/files/CSXkjqLBAXmsVukiQezr)

{% hint style="info" %}
**💡 Tip**: To obtain a player's wallet address, click on their avatar to open up their profile, then click on the **Copy to clipboard** button next to the wallet address.
{% endhint %}

Banned players will be unable to load your scene or interact with any of its content. Other players will not see them in the scene, or read any of their chat messages.

{% hint style="warning" %}
**📔 Note**: The effects of your ban are immediate and permanent. Once a player is banned, they will remain banned until the ban is lifted. While banned, a player can't see or interact with your scene, can't chat in the Nearby channel while in it, and other players in the scene can't see them.

If a player steps outside your scene's bounds, they are no longer affected by your scene's ban rules and will see banned players once more.
{% endhint %}

Click **View Ban List** to see the list of currently banned players. From this list you can also **Unban** players.

## Trigger smart items

To Trigger an action from any smart item in the scene:

* Add a smart item to your scene
* Open the settings for the **Admin Tools** Smart Item in the Creator Hub
* In the **Smart item actions** section, add the smart item from the dropdown, give it a custom name and select a default action

Once the above is configured, admins can trigger the action by opening the **Smart Items** tab of the admin panel and selecting an item from the dropdown list. They can then pick one of the item's actions from the **Actions** dropdown and click **Play Action** to trigger it. There's also a button to **Hide/Show** the selected item.

<img src="/files/gqhPG1haKya0Y2tvvPXS" alt="Scene name" width="300">

You can also show or hide any smart item in this list, even if it doesn't include an action to do that.


# Live Streaming

Stream live video into your scene using the Video Screen and Admin Tools.

Use the **Video Screen** smart item together with the **Admin Tools** smart item to stream live video into your scene.

Decentraland offers different ways to stream live video into your scene:

* **DCL Cast** *(Easy Mode)*: Use Decentraland's free streaming web app to easily share your camera or screen with other players in the scene, no need to set up a streaming software. This mode has the lowest latency and is the easiest to set up.
* **Stream** *(Advanced Mode)*: Use a streaming software like [OBS](https://obsproject.com/) to stream through Decentraland's streaming infrastructure. This mode allows you to have more control over the stream, like screen layout and audio sources.
* **Video URL** *(Advanced Mode)*: Point to your own streaming infrastructure, by pasting the URL into the **Video URL** field.

<img src="/files/iT553DZvuIl2pwCoBUNz" alt="Stream methods" width="400">

Streaming works in Worlds and Genesis City, with no audience limits on the scene side.

## Configure the scene

The following steps are common to both DCL Cast and Stream methods:

1. Add a **Video Screen** smart item to your scene.

   ![](/files/Kz8YR1z4Hft0RdmcX5Le)
2. Add an **Admin Tools** smart item and enable the **Video Screens** section. Select each screen from the dropdown and give it a friendly name for the admin UI.

   ![](/files/ObUQmntY23Vz8zwMUfTQ)
3. Publish your scene (World or Genesis City) and enter as a user with admin permissions.

   ![](/files/7sIplvxXBqV1ti3Mllrn)

Once your scene is published, you can enter as a user with admin permissions and configure the streaming settings.

{% hint style="info" %}
**💡 Tip**: If you add multiple Video Screens to show the same video, configure all but one's source to point to the same video player, see [Multiple Video Screens](/creator/scene-editor/interactivity/video-screen#multiple-video-screens) for more details.
{% endhint %}

## DCL Cast (easy)

### Sharing access to the app

Enter your published scene as an admin user, and open the admin panel. Select the **Video** tab, then select the **DCL Cast** functionality.

<img src="/files/KInNHT0zAaNB63DA9t6M" alt="DCL Cast" width="400">

You'll see two links that you can copy and share with others.

* **Cast Speakers**: This link is for the speakers to use to cast their video to the scene.

  <div data-gb-custom-block data-tag="hint" data-style="danger" class="hint hint-danger"><p><strong>❗Warning</strong>: Treat the streaming link as a secret, only share it with people you trust. Reset the link between presenters if needed.</p><p>When finished streaming, close the DCL Cast browser tab to free the channel.</p></div>
* **Viewers**: This link is for the audience to use to watch the video from a browser or mobile. This is useful for players who are currently not inside Decentraland.

Click the **Copy link** button to copy the links to the clipboard.

When ready to stream, click the **Activate** button to make the stream visible to the audience in the scene.

<img src="/files/NNLZhPZxt3gtVmXgCQbL" alt="Activate stream" width="150">

If for any reason you need to reset the room, click the **Reset Room** button to generate a new one. Anyone who's currently streaming will be disconnected.

<img src="/files/NVbDSJuq0bD6v5Lbij8L" alt="Reset room" width="150">

### Using the DCL Cast app

When someone pastes the speaker link into a browser, they'll see a screen like this:

<img src="/files/R1T5fOGaFk1Ur1Gbh0P5" alt="DCL Cast app" width="400">

The browser will ask for permission to share your camera and microphone. You can also configure the different input devices to use for the stream.

{% hint style="info" %}
**📔 Tip**: Use Google Chrome or a browser built on the Chrome engine. These browsers offer the functionality to easily share both video and audio directly from a browser tab.
{% endhint %}

Users can input a name (doesn't need to match their Decentraland username) and click the **Join Now** button to start streaming.

Once streaming, the app is similar to various familiar video conferencing apps, with buttons to mute/unmute, share camera and screen, and a chat interface.

The chat is read-only, and listens to all messages sent by players inside the scene in Decentraland. This is great to keep in touch with the audience, even if you're streaming from a different device.

<img src="/files/jFwF1tz1BjIiAm5mFcNC" alt="DCL Cast app" width="700">

On the **Participants** tab you can see three lists:

* **Speakers**: The people who are currently streaming to the scene.
* **Viewers**: The people who are currently watching the stream from a browser.
* **In-world participants**: The players who are currently inside the scene, watching the stream in-world.

<img src="/files/GboUHLI8Pqfi7Te6WGiA" alt="Participants tab" width="200">

If multiple speakers are present in a DCL Cast session, players in-world will hear the voices of all speakers, and the see the video will automatically switch to show whoever is currently emitting sound, to always show who's speaking.

To override this default behavior:

* Click the **Speakers** button on the scene admin panel

<img src="/files/mGqD1AKJlxcjwULZWLg3" alt="Participants tab" width="200">

* Pick one of the speakers and select a source to showcase (either that speaker's camera or screen)

<img src="/files/e8N6zqm2mZS35H9eCSKM" alt="Participants tab" width="200">

This will force this source to be always shown on screen, regardless of if other speakers are talking.

{% hint style="info" %}
**📔 Tip**: If you're also in-world watching the stream, you may find it jarring to hear echo from audio repeated both in the DCL Cast app and in the Decentraland scene. You can easily mute all audio from the DCL Cast app by toggling the speaker icon on the bottom-left of the screen

<img src="/files/N9kWP6Sm6KXS4WMo42Gb" alt="Participants tab" data-size="original">

Otherwise you can mute audio in the Decentraland settings.
{% endhint %}

### Share presentations

You can also share the contents of a slide presentation as an alternative source of images.

* From in-world, click the **Share presentation** button in-world in the DCL Cast tab. From the DCL Cast app, click the dropdown next to the **Share Screen** button and select **Share presentation**.

<img src="/files/Ue2p8pR2Hd5skYhlwdXU" alt="Participants tab" width="200">

* Paste a Google slides link, a link to a .pdf hosted in Drive or a similar source, or upload a .pdf file.

The presentation will now be a source that can be selected to show on screen, while the voices of all speakers are still heard.

{% hint style="warning" %}
**📔 Note**: Presentation files must be under 100 MB. Google slides presentations must be set to *public*.

There can only be one active presentation at a time in a DCL Cast session.
{% endhint %}

You can then switch slides, or even play and pause any videos that are embedded in these slides by pressing buttons that exist both in the DCL Cast app and in-world in the Admin Tools UI.

## Stream (advanced)

To use the Live Streaming feature on your scene you'll need to install a streaming software that can output to an RTMP endpoint (e.g. [OBS](https://obsproject.com/), [XSplit](https://www.xsplit.com/), [StreamYard](https://streamyard.com/)).

{% hint style="warning" %}
**Warning**: Live streaming is not supported in Single Player worlds. If your world has **Single Player** enabled in World Settings (or `fixedAdapter` set to `"offline:offline"` in `scene.json`), disable it before setting up streaming. The streaming feature relies on the communications layer, which is disabled in Single Player mode.
{% endhint %}

### Get stream credentials

1. Open the Admin UI in the scene (top‑right icon).

   ![](/files/5qs3neoktFnhFdxrCvWL)
2. In the **Video** tab, switch to **Stream** and click **Get Stream Key**.

   ![](/files/KY2VsMpOkVRUnhKXc124)
3. Copy the **RTMP Server** and **Stream Key** into your streaming software.

   ![OBS configuration](/files/eCfLYnokVQlZKDGccTNz)

{% hint style="danger" %}
**❗Warning**: Only one person can stream to a scene at a time. When finished streaming, click **Stop Streaming** in your software to free the channel.
{% endhint %}

### Start and control the stream

1. Start streaming from your software.
2. In the Admin UI, click **Activate** to show the stream in the scene.

   <img src="/files/NNLZhPZxt3gtVmXgCQbL" alt="Activate stream" width="100">

### Stream keys

Stream keys are generated per scene and are valid for 4 days (96 hours). A single live session can run up to 4 hours continuously.

![](/files/lRrfQ6aK6grSvquEVYNU)

* Click **Reset Stream Key** to revoke the current key and issue a new one. Ongoing streams will stop.
* Each scene has its own streaming address and key. Admins can share the key with external streamers.
* Only one stream can be active per scene at a time; starting a new one will overwrite the current stream.

{% hint style="danger" %}
**❗Warning**: Treat stream keys as secrets. Reset the key between presenters if needed.
{% endhint %}

## Streaming from URL (advanced)

You can also stream by configuring the Video Screen to use the option **Video URL** and pasting a stream URL.

You should be able to paste a URL pointing to a video from most popular video streaming sites. Be mindful of the terms of service with these platforms.

To stream from a video file you have on your local machine, the easiest path is to upload this video to a public Google Drive and paste the link.

* The URL must be `https`. See [About External Streaming](/creator/scenes-sdk7/media/video-playing#about-external-streaming).
* Recommended providers include [Vimeo](https://vimeo.com/), [Bunny](https://bunny.net), [Livepeer Studio](https://livepeer.studio/) and [Serraform](https://serraform.gitbook.io/streaming-docs/guides/decentraland-playback).
* Tips for encoder setup: [Setting up OBS for successful streaming](/creator/scenes-sdk7/media/video-playing#setting-up-obs-for-successful-streaming).


# Server Data

View and edit the live data stored by your scene's Multiplayer Server.

Scenes that use a [Multiplayer Server](/creator/scenes-sdk7/networking/authoritative-servers) can persist data on the server: leaderboards, player progress, environment changes like doors opened or items placed, and more. This data is updated **live** as players interact with your published scene.

You can view all of this data from a web UI, and you can also **change it directly from there**. Any edits you make take effect on the live scene, without needing to republish. This includes:

* **Scene data**: values shared by all players, like a leaderboard or the state of a door.
* **Player data**: values stored for a single player, like their progress or preferences.
* **Environment variables**: configuration values and secrets that only the server can read.

## Access the storage UI

You can open the storage UI directly at [decentraland.org/storage](https://decentraland.org/storage).

You can also reach it from the Creator Hub:

1. Open the **Manage** section of the Creator Hub.
2. Click the **three dots** next to a place where you have published content.
3. Select **View Storage**.

<img src="/files/xMDp2RrTzpnM57VKbzNO" alt="View Storage option in the Creator Hub" width="400">

The storage UI shows a list of all the Worlds and LAND locations where you have published scenes, or have operator permissions. Open a scene to see its data, organized into three tabs: **Scene**, **Player**, and **Environment**.

{% hint style="info" %}
**💡 Tip**: This data only exists for scenes that use a Multiplayer Server and that store data via the `Storage` API. See [Multiplayer Server](/creator/scenes-sdk7/networking/authoritative-servers) to learn how to set that up.
{% endhint %}

## Scene data

The **Scene** tab lists all the stored variables that are shared across all players, for example a leaderboard or the current state of the environment.

![Scene data tab](/files/87djyX4SBJ4W1bCByqyG)

Values on this list update live as players interact with your scene. You can also edit or remove any of these variables by clicking the pencil or trash icon. Changes are picked up by the running scene, so this is a handy way to tweak live values, like resetting a leaderboard, without republishing.

## Player data

The **Player** tab lists all the players that have any data stored on your server. You can search for a player by wallet address or name, and then see all of their associated data.

As with scene data, you can edit or remove any value by clicking the pencil or trash icon.

This is especially useful for support: if a particular player reports an issue in your scene, you can look them up and inspect their stored data to understand their situation. If they ended up wedged in a bad state, for example with contradicting data from an older version of your scene, you can edit or clear their records to restore them to a stable state, without redeploying anything.

## Environment variables

The **Environment** tab lists all the environment variables defined for your scene. These are configuration values that only the server can read, which makes them the right place for **secrets** like private keys or reward claim codes: the values never travel through a player's machine or appear in your scene's published code.

![Environment variables tab](/files/hkSxy2F1SvdETJcP1yhz)

From this tab you can add new variables, or overwrite and delete existing ones using the pencil or trash icon. Note that you can't *read* the current value of a variable, this is intentional, to protect sensitive data. You can only replace or delete it.

Environment variables are also great for feature flags or game parameters, like a match duration or a maximum player count, that you may want to adjust on the live scene without republishing.

## Learn more

To learn how to read and write this data from your scene's code, including best practices for changing the structure of stored data over time, see [Multiplayer Server](/creator/scenes-sdk7/networking/authoritative-servers).


# Editor FAQs


# Getting started


# SDK Quick Start

Getting started with the Decentraland SDK

This tutorial walks you through creating your first scene, mixing the different tools you have available: the visual Scene Editor of the Creator Hub, hand-written code using the Decentraland SDK, and AI-assisted **vibe coding**. You'll use all three together, and learn when each one shines.

## Install the Creator Hub

The Creator Hub allows you to build, preview and deploy Decentraland scenes. Download the Creator Hub [here](https://decentraland.org/download/creator-hub).

To edit your scene's code, you also need a code editor. [Visual Studio Code](https://code.visualstudio.com/) and [Cursor](https://www.cursor.com/) are both great options, but any code editor works.

Read the [Installation guide](/creator/scene-editor/get-started/editor-installation) for more details.

## Create your first scene

1. Open the Creator Hub.
2. Select the **Scenes** tab, and click **New Scene**.

   ![](/files/Sp7N7I2AtgQjMQPXoJz0)
3. Pick a starting template. For this exercise, pick the **Empty Scene**.

This step may take a couple of minutes. It populates your folder with the default set of files for a basic scene. Once that's done, you'll see the empty grid of your scene.

## Add items from the asset packs

Explore the **Asset packs** on the bottom section of the Scene Editor, and drag a couple of items into your scene. Any items will do for now.

![](/files/1zhrDPWV481ohN7N8wFG)

Already placed items can be clicked and dragged to reposition them. See [Scene editor essentials](/creator/scene-editor/get-started/scene-editor-essentials#position-items) for more details.

{% hint style="info" %}
**💡 Tip**: Cover the entire scene with a ground item. Items of type **Ground** have a paint bucket icon on them. If you drag one of these into your scene, it covers all of your scene's ground with copies of this item.

<img src="/files/Jnt8UTD2pKU4SS7BOzjc" alt="Ground" data-size="original">
{% endhint %}

## Run a preview

Click the **Preview** button on the top menu to load your scene inside Decentraland. You can now explore the scene as a Decentraland avatar.

![](/files/vHDAf6kGdDlFiqRPK59T)

You can keep the preview window open while you work: it updates every time you make a change. Read more in [preview a scene](/creator/scenes-sdk7/getting-started/preview-scene).

## Custom 3D assets

Download this 3D model of an avocado in *glb* format from the following [link](https://github.com/decentraland-scenes/avocado/raw/main/avocado-glb.zip) and unzip it.

![](/files/sco02lfFbQSvxPrEHTyc)

Drag the **avocado.glb** file from your file explorer onto the bottom panel of the Scene Editor (the same panel that holds the **Asset Packs** and **Local Assets** tabs) and click **Import**.

![](/files/GRxOiqgIuiefVNWmiDO7)

You can now find the **avocado.glb** model in the **Local Assets** tab, inside the **Scene** folder. Drag the file onto your scene, like any item from the Asset Packs.

![](/files/S4khhyrNLnAt5nfyQ6nw)

## Edit the scene code

Click the **<> Code** button on the top menu to open your scene project in your code editor.

![](/files/jjBKzspRh4t2aDMEwv7d)

{% hint style="warning" %}
**📔 Note**: If nothing opens, make sure you have a code editor like [Visual Studio Code](https://code.visualstudio.com/) or [Cursor](https://www.cursor.com/) installed.
{% endhint %}

On the left margin of your code editor you can navigate the files and folder structure of your project. Open the `index.ts` file inside the `src` folder. Its content should look like this:

```ts
import {} from '@dcl/sdk/math'
import { engine } from '@dcl/sdk/ecs'

export function main() {}
```

Decentraland scenes are written in [TypeScript](https://www.typescriptlang.org/), using the Decentraland SDK: a library with everything you need to position 3D content, add interactivity, and control what happens in your scene.

This file defines a function called `main()`, which is the entry point to the scene: any code you put there runs when the scene first loads.

You already dragged one avocado into the scene visually. Now let's add a second one, this time by writing code. Replace the full contents of your `index.ts` file with the following:

```ts
import { Vector3 } from '@dcl/sdk/math'
import { engine, Transform, GltfContainer } from '@dcl/sdk/ecs'

export function main() {
	// create a fresh new Entity
	let avocado2 = engine.addEntity()

	// give it a Transform
	Transform.create(avocado2, {
		position: Vector3.create(8, 0, 8),
	})

	// give it a GLTF
	GltfContainer.create(avocado2, {
		src: 'assets/scene/avocado.glb',
	})
}
```

These lines create a new [entity](/creator/scenes-sdk7/architecture/entities-components), give it a [shape](/creator/scenes-sdk7/3d-content-essentials/shape-components) based on the 3D model you downloaded, and [set its position](/creator/scenes-sdk7/3d-content-essentials/entity-positioning) via the **Transform** component.

As a rule of thumb, the code you write in `index.ts` should all be inside `main()` (or in other functions that are referenced indirectly by main). See [Scene lifecycle](/creator/scenes-sdk7/getting-started/coding-scenes#scene-lifecycle) for more details.

Run the scene preview: you should now see two avocados, the one you added in the Scene Editor and the one you added via code.

![](/files/6Shp1mB2B8VikHDzNkrH)

{% hint style="warning" %}
**📔 Note**: The second avocado exists **only in your code**. It shows up when you run the scene, but the Scene Editor canvas and entity tree can't display entities created in `index.ts`. Don't be alarmed if you don't see it in the editor. This is a key thing to keep in mind when you mix visual editing with code.
{% endhint %}

Both avocados are built from the same pieces. Select the **first** avocado in the Scene Editor: the properties panel shows a **Transform** and a **GltfContainer** component with the same kinds of fields you just wrote in code. They're two views of the same thing.

![](/files/IXfnWBmy7F1wdtrx7lWR)

## Add interactivity with a Script

Let's make an avocado respond to the player. We could do it by adding code into the `index.ts` we were already editing, but instead let's use the **Script component**: a way to attach code directly to an item in the Scene Editor. It keeps each item's behavior self-contained, and you can even reuse the same script on several items.

1. In the Scene Editor, select the first avocado (the one you dragged in; remember, the code-only avocado isn't visible here).
2. Click the **+** button at the top of the properties panel and select **Script** to add a Script component.
3. Click **+ Create New Script** and name it `AvocadoScript`.

![](/files/Sfcn0bjkn0yjn0O8Ldps)

4. Click the **<> Code** button on the Script component to open the new file in your code editor.

The script is a class with three main parts (comments trimmed for brevity):

```ts
import { engine, Entity } from '@dcl/sdk/ecs'
import {} from '@dcl/sdk/math'

export class AvocadoScript {
	constructor(
		public src: string, // DO NOT REMOVE
		public entity: Entity, // DO NOT REMOVE
		// Add your custom inputs below
	) {}

	start() {
		// Called once, when the scene loads
	}

	update(dt: number) {
		// Called on every frame
	}
}
```

* The **constructor** defines parameters that show up as editable fields on the Script component in the Creator Hub. Don't remove `src` or `entity`.
* **`start()`** runs **once**, when the scene loads. Use it for setup: creating components, registering click handlers, etc.
* **`update(dt)`** runs on **every frame** of the game, roughly 30 times per second. Use it for continuous behavior, like movement. `dt` tells you how many seconds passed since the last frame.

Inside the class, `this.entity` always refers to the entity that holds the Script component: in this case, your avocado. This is what makes scripts reusable: attach the same script to ten items, and each one acts on itself.

### Vibe code your first interaction

You can write the following code by hand, but this is a great moment to try **vibe coding**: describing what you want to an AI assistant, and letting it write the code. Most code editors have one built in, like Cursor's chat, GitHub Copilot in VS Code, or [Claude Code](https://claude.com/product/claude-code). You can also write prompts from outside your code editor, like with Claude Desktop or Claude Code in the command line.

Before your first prompt, install the Decentraland SDK skills, so the AI knows the SDK's patterns and makes far fewer mistakes:

```bash
npx skills add decentraland/sdk-skills
```

These skills are reference documents that the AI consults whenever it's unsure how to do something with the SDK, so it writes correct code instead of guessing. See [Vibe Coding with AI](/creator/scenes-sdk7/getting-started/vibe-coding) for setup options and prompting tips.

Now try a prompt like this:

> In AvocadoScript.ts, make the avocado log a message to the console when the player clicks on it.

You should end up with something like this (or paste it in yourself):

```ts
import { engine, Entity, pointerEventsSystem, InputAction } from '@dcl/sdk/ecs'
import {} from '@dcl/sdk/math'

export class AvocadoScript {
	constructor(
		public src: string,
		public entity: Entity,
	) {}

	start() {
		pointerEventsSystem.onPointerDown(
			{
				entity: this.entity,
				opts: { button: InputAction.IA_POINTER },
			},
			() => {
				console.log('CLICKED AVOCADO')
			}
		)
	}

	update(dt: number) {}
}
```

It added some click behavior inside the `start()` function. We only need to define the click behavior once, and it will react to each time the player clicks on the item. The `pointerEventsSystem.onPointerDown()` statement defines three things:

* What `entity` the click events work on: here `this.entity`, the avocado holding the script.
* An `opts` object: what button to use, and other optional arguments we're not using now.
* A function that runs every time the entity is clicked.

To see the logged message, run the preview and open the console by clicking the ![](/files/U3NUJd1Ri2m0ihUjwtiJ) icon on the top-right corner. You can also toggle it by pressing the **\`** key. Each time you click the avocado, you'll see a new line appear:

![](/files/xr1HOMVIBkTZionm4vkc)

{% hint style="warning" %}
**📔 Note**: For an entity to be clickable, it must have a collider geometry. The model used here already includes one. See [Colliders](https://github.com/decentraland/docs/tree/main/creator/sdk7/3d-modeling/colliders.md) for workarounds for models that don't.
{% endhint %}

### Make the avocado vanish

Let's make the click do something more exciting now! Ask your AI assistant:

> When the avocado is clicked, make it disappear. I want it to disappear with a shrinking bouncy animation. Also I want the hint I see when pointing at the avocado to read "Collect".

You should end up with something like this:

```ts
import { engine, Entity, pointerEventsSystem, InputAction, Tween, EasingFunction } from '@dcl/sdk/ecs'
import { Vector3 } from '@dcl/sdk/math'

export class AvocadoScript {
	constructor(
		public src: string,
		public entity: Entity,
	) {}

	start() {
		pointerEventsSystem.onPointerDown(
			{
				entity: this.entity,
				opts: { button: InputAction.IA_POINTER, hoverText: 'Collect' },
			},
			() => {
				this.collect()
			}
		)
	}

	collect() {
		Tween.setScale(
			this.entity,
			Vector3.One(),
			Vector3.Zero(),
			500,
			EasingFunction.EF_EASEINBOUNCE
		)
	}

	update(dt: number) {}
}
```

Let's unpack what the AI did.

* To make the bouncy animation, it used a **Tween**. A tween describes a gradual transition of an entity's position, rotation or scale over time. Here `Tween.setScale()` shrinks the avocado from full size (`Vector3.One()`) to nothing (`Vector3.Zero()`) over 500 milliseconds, using a bouncy easing curve. Learn more about tweens in [move entities](/creator/scenes-sdk7/3d-content-essentials/move-entities).
* Instead of writing the tween directly inside the click function, it created a separate `collect()` method. This isn't required (if your AI put the tween inside the click function, that works too), but it's good practice: methods keep code readable and let you reuse the same logic from different places.
* To show the "Collect" hint on the avocado, it set that as the `hoverText` value.

Run the preview and click the avocado: it should vanish with style.

{% hint style="warning" %}
**📔 Note**: The avocado shrinks to a size of 0, but the entity still exists. Ideally you should delete the entity after the tween is over, to keep your scene lighter. See [On tween finished](/creator/scenes-sdk7/3d-content-essentials/move-entities#on-tween-finished).
{% endhint %}

### Run code every frame

So far all our code ran in `start()`. Let's use `update()` to make the avocado spin continuously. Replace the constructor and `update()` with:

```ts
	constructor(
		public src: string,
		public entity: Entity,
		public speed: number = 45,
	) {}

	update(dt: number) {
		const transform = Transform.getMutable(this.entity)
		transform.rotation = Quaternion.multiply(
			transform.rotation,
			Quaternion.fromAngleAxis(this.speed * dt, Vector3.Up())
		)
	}
```

You'll also need to add `Transform` and `Quaternion` to the imports at the top of the file, so they look like this:

```ts
import { engine, Entity, pointerEventsSystem, InputAction, Tween, EasingFunction, Transform } from '@dcl/sdk/ecs'
import { Vector3, Quaternion } from '@dcl/sdk/math'
```

{% hint style="info" %}
**💡 Tip**: Instead of editing imports by hand, you can click on the errors marked by your code editor and let it auto-add them.
{% endhint %}

On every frame, this rotates the avocado a little further. Multiplying by `dt` makes the movement smooth and frame-rate independent: the avocado spins at 45 degrees per second, no matter how fast the player's machine runs.

Because `speed` is a constructor parameter, it also appears as a field on the Script component in the Creator Hub. Click the refresh icon on the top-right of the Script component to see it, then tweak the value without touching any code.

<img src="/files/a4ThERIIrKfO8e2VpYnm" alt="Refresh button" width="360">

Each entity stores its own value for the **Speed** field, so several items can share the same script but behave differently. Try it out: copy the avocado with Ctrl + C and Ctrl + V, move the copy so the two don't overlap, and set a different speed on each. Each avocado now spins at its own rate.

Scripts can do a lot more, like exposing actions that other smart items can trigger. See [Script component](/creator/scene-editor/extend-with-code/script-component) for the full picture.

## Reference an item from the Scene Editor

The Script component is the easiest way to give behavior to a single item, but there's an alternative: your code in `index.ts` can fetch any item you added visually, by name, using `engine.getEntityOrNullByName()`. This is handy when one piece of logic involves several items, or when you want everything in one place. Use the name that appears on the [entity tree](/creator/scene-editor/get-started/scene-editor-essentials#the-entity-tree).

In this example, we use an entity named **Yellow Crate**. You can use any item, just write its name exactly as it appears on the entity tree.

{% hint style="info" %}
**💡 Tip**: You can rename entities by doing right-click and selecting **Rename** on the entity tree.
{% endhint %}

```ts
export function main() {
	// avocado2 code from before
	// (...)

	const crate = engine.getEntityOrNullByName('Yellow Crate')

	if (crate) {
		pointerEventsSystem.onPointerDown(
			{
				entity: crate,
				opts: { button: InputAction.IA_POINTER, hoverText: 'Open' },
			},
			function () {
				console.log('CLICKED CRATE')
			}
		)
	}
}
```

Here `engine.getEntityOrNullByName()` fetches a reference to the entity named *Yellow Crate*. The `if (crate)` check ensures the entity really exists in the scene; if there's no entity by that name, `crate` is `null`. See [Reference Items](https://github.com/decentraland/docs/tree/main/creator/sdk7/code/reference-items.md) for more info.

{% hint style="info" %}
**💡 Tip**: All entities added via the Scene Editor are already loaded by the time `main()` runs, so it's safe to reference them there or on functions indirectly called by `main()`.
{% endhint %}

## More Tutorials

Read [Coding scenes](/creator/scenes-sdk7/getting-started/coding-scenes) for a high-level understanding of how Decentraland scenes function.

For examples built with SDK7, check out the [Examples page](https://studios.decentraland.org/resources?sdk_version=SDK7), which contains several small scenes.

See the **Development guide** section for more instructions about adding content to your scene.

## Engage with other developers

Visit the [Decentraland Discord](https://dcl.gg/discord) and the [Decentraland DAO Discord](https://discord.gg/bxHtcMxUs4) to join a lively discussion about what's possible and how in the Decentraland Discord's **Creators** section.

To debug any issues, check the [Troubleshooting](/creator/scenes-sdk7/debugging/troubleshooting) and [debug](/creator/scenes-sdk7/debugging/debug-in-preview) sections. An AI assistant with the [SDK skills](/creator/scenes-sdk7/getting-started/vibe-coding) installed is also a great debugging companion: paste the error message from the console, or describe what's not behaving as expected, and it can usually find the problem in your code. If you don't find a solution, you can post to the [SDK Support category](https://forum.decentraland.org/c/support-sdk/11) on the Decentraland Forum.

## 3D Art Assets

A good experience will have great 3D art to go with it. If you're keen on creating those 3D models yourself, see the [3D Modeling section](/creator/3d-modeling-and-animations/3d-models). But if you prefer to focus on the coding or game design side of things, you don't need to create your own assets! See [Useful Resources](/creator/scenes-sdk7/getting-started/useful-resources) for asset libraries and AI tools you can use to source 3D models for your scene.

## Publish your scene

If you own a Decentraland NAME, an ETH ENS name, or LAND, or have permissions given by someone that does, you can upload your scene to Decentraland. See [publishing](/creator/scenes-sdk7/publishing/publishing).

## Other useful information

* [Vibe Coding with AI](/creator/scenes-sdk7/getting-started/vibe-coding)
* [Development workflow](/creator/scenes-sdk7/getting-started/dev-workflow)
* [Editing Scenes](/creator/scene-editor/get-started/about-editor)
* [Scene editor essentials](/creator/scene-editor/get-started/scene-editor-essentials)
* [Design constraints for games](/creator/scenes-sdk7/designing-the-experience/design-games)
* [3D modeling](/creator/3d-modeling-and-animations/3d-models)
* [Scene limitations](/creator/scenes-sdk7/optimizing/scene-limitations)


# Development Workflow

Recommended procedure for developing and testing a scene

This document outlines the steps recommended for developing a scene for Decentraland, from ideation to publishing and beyond.

## Install the Creator Hub

Make sure you have the Decentraland Creator Hub installed.

* [Installation Guide](/creator/scene-editor/get-started/editor-installation)

If you intend to work with code, also make sure you install [Visual Studio Code](https://code.visualstudio.com/) or [Cursor AI](https://www.cursor.com/).

{% hint style="info" %}
**💡 Tip**: You can also use AI assistants to generate scene code from plain language descriptions. See [Vibe Coding with AI](/creator/scenes-sdk7/getting-started/vibe-coding) for how to get started with AI-assisted development.
{% endhint %}

## Design your experience

Think about how much space you need to take up, what kind of distribution, what kinds of mechanics you want players to be able to carry out, etc. The following documents can serve as a guide:

* [UX & UI Guide](/creator/scenes-sdk7/designing-the-experience/ux-ui-guide)
* [Design constraints for games](/creator/scenes-sdk7/designing-the-experience/design-games)
* [Scene MVP guidelines](/creator/scenes-sdk7/designing-the-experience/mvp-guidelines)

## Where to publish

In Decentraland, content is published to adjacent plots of land in a finite amount of space. Players can freely walk from one to the other. Each scene is its own contained little world, items from one scene can't extend out into another scene, and the code for each scene is sandboxed from all others.

Permission to publish to each of these is controlled via tokens. You don't need land to develop a scene, but you will need access to land once you're ready to publish.

Alternatively, you have the option to publish to Decentraland [Worlds](/creator/scenes-sdk7/publishing/publishing-options#decentraland-worlds), which are self-contained and isolated scenes.

The following options are available:

* Rent LAND
* Purchase LAND
* Obtain permissions from a land owner
* Publish to a Decentraland World, see [worlds](/creator/scenes-sdk7/publishing/publishing-options#decentraland-worlds) to learn more.

See [Publishing options](/creator/scenes-sdk7/publishing/publishing-options) for more details.

## Templates and examples

When creating a new scene, choose amongst several base template scenes that include some basic code and 3d models. Use these to get started faster.

* [Example scenes](https://studios.decentraland.org/resources?sdk_version=SDK7): here you can find a large collection of example scenes, each showcasing different mechanics that you can borrow. You can also clone any of these scenes and use it as a starting point.
* [Helper libraries](https://studios.decentraland.org/resources?sdk_version=SDK7\&resource_type=Library): these can simplify many common tasks.

## Art assets

If you're an experienced artist or you have access to someone who is, you can create custom `.gltf` or `.glb` models for your scene. See [3D model essentials](/creator/3d-modeling-and-animations/3d-models) for tips on how to create 3D models for Decentraland.

You don't need to create your own assets, though. See [Useful Resources](/creator/scenes-sdk7/getting-started/useful-resources) for asset libraries and generative AI tools you can use to source 3D models, as well as other tools that can speed up your workflow.

## Run a local preview

To run a preview of your scene, open it in the Creator Hub and click the **Preview** button. Alternatively, if you're working from the command line, run `npm run start` on your project's root folder.

* [Preview your scene](/creator/scenes-sdk7/getting-started/preview-scene) for more details.
* Check the [Debug a scene](/creator/scenes-sdk7/getting-started/preview-scene#debug-a-scene) for tips on how to debug any issues.

{% hint style="info" %}
**💡 Tip**: When using the Creator Hub, every time you make a change on your scene, the preview is automatically updated. Even while running.
{% endhint %}

## Publish to Decentraland

Once you're happy with your scene, it's time to publish to Decentraland. For this, you need to own LAND, a Decentraland NAME, or an ETH ENS name, or have permissions given by someone that does.

See [publishing](/creator/scenes-sdk7/publishing/publishing) for instructions on how to do that.

Alternatively, you can publish to [Worlds](/creator/scenes-sdk7/publishing/publishing-options#decentraland-worlds), a personal 3D space that doesn't require LAND.

## Promote

Now that your scene is out there, spread the voice! Here are a few ways to do that:

* Share it on social media (#DCL)
* Announce it on [Discord](https://dcl.gg/discord)
* Submit it to be featured on [events.decentraland.org](https://events.decentraland.org/)
* Organize an event in your scene
* Add a spawn point on a high-traffic area that links to your scene

## Iterate

Once your scene has been live for a while and you've gotten feedback from players, you're in a great position to iterate on it!

Update your content with improvements and new features, deploying new versions of your scene to the same coordinates.

## Giving back

If you create a scene, game, or application that you're proud of, consider making it open source! That way others can learn from your code and build on your work. You can also share the whole project in [Awesome Repository](https://github.com/decentraland-scenes/Awesome-Repository).

If you build a reusable piece of functionality, you may want to make it into a library that others can import into their projects.


# Preview Your Scene

What you can see in a scene's preview

Once you have [built a new scene](#create-your-first-scene) or downloaded a [scene example](https://studios.decentraland.org/resources?sdk_version=SDK7) you can preview it locally.

## Using the Scene Editor in Creator Hub

Make sure you've [installed the Creator Hub](https://github.com/decentraland/docs/tree/main/creator/sdk7/get-started/editor-installation.md).

1. Open your scene project.
2. Click the **Preview** button on the top-right corner. This will open a new window with the Decentraland Desktop Explorer, running just your scene. There you can move around the scene and interact with interactive items.

![](/files/kFXFURDUtsBJrB1sRPNv)

Configure different preview options from the dropdown menu next to the **Preview** button:

* **Preview with**: Choose between **Desktop Client** (the default Decentraland Explorer) and **Bevy (Web)**, which opens the preview in your browser using the Bevy Web client. The Bevy Web option is equivalent to the `--web` CLI flag.
* **Open Console Window During Preview**: Opens a new window with the console output of the scene. This is useful to debug errors in the scene.
* **Skip Auth Screen**: Skips the account selection screen and automatically logs you in with your currently logged in account. This is disabled by default, enable it if you want to test multiple accounts.
* **Landscape Terrain Enabled**: Toggles the landscape around the scene. This is enabled by default, disable it to lower the scene's memory footprint.
* **Enable MCP Server**: Launches the Explorer with the MCP automation server enabled, so AI agents can see and control the running preview. Only visible when your project's SDK version supports it. See [Vibe Coding with AI](/creator/scenes-sdk7/getting-started/vibe-coding#let-the-ai-see-your-scene-in-world) for the full workflow.
* **Optimize Assets**: Previews the scene with locally generated asset bundles, matching how it renders in production after [asset bundle conversion](/creator/scenes-sdk7/optimizing/performance-optimization#asset-bundle-conversion). The first run converts all assets, which can take several minutes on large scenes. Only available with the Desktop Client (not Bevy Web).
* **Show QR Code for Mobile**: Displays a QR code that opens your scene preview in the [Decentraland mobile app](/creator/build-for-mobile/mobile-client/overview). Scan the code with a phone on the same Wi-Fi network as your computer. See [Preview on mobile](/creator/build-for-mobile/develop/preview-on-mobile) for details.

{% hint style="info" %}
**Tip:** You can also preview your scene directly on the Decentraland mobile app. Use the **Show QR Code for Mobile** option in Creator Hub, or run `npm run start -- --mobile` from the CLI. See [Preview on mobile](/creator/build-for-mobile/develop/preview-on-mobile) for details.
{% endhint %}

## Using the CLI

To preview a scene run the following command on the scene's main folder:

```bash
npm run start
```

Any dependencies that are missing are installed and then the CLI creates a local web server in your system and launches the scene in the Decentraland Desktop client via a `decentraland://` deeplink. The Desktop client is the default preview target.

To preview in a browser tab instead, add `-- --web` (or `-- --bevy-web`) to open the scene in the Bevy Web client at `decentraland.org/bevy-web/`.

Every time you make changes to the scene, the preview reloads and updates automatically, so there's no need to run the command again.

{% hint style="warning" %}
**📔 Note**: Some scenes depend on communicating with an external server to carry out custom logic or store and retrieve data. When previewing one of these scenes, you'll likely have to also run the server locally on another port. Check the scene's readme for instructions on how to launch the server as well as the scene.
{% endhint %}

### Parameters of the preview command

You can add the following flags to the `npm run start` command to change its behavior:

* `-- --web` (alias `-- --bevy-web`) Opens the preview in the Bevy Web browser client at `decentraland.org/bevy-web/` instead of the Desktop Explorer. Chromium-based browsers (Chrome 142+) require the Local Network Access permission for the hosted page to reach your local preview server — when the browser asks to access apps on your device, click "Allow".
* `-- --mobile` (alias `-- -m`) Shows a QR code in the terminal that opens your scene in the Decentraland mobile app on a phone connected to the same Wi-Fi network. See [Preview on mobile](/creator/build-for-mobile/develop/preview-on-mobile).
* `-- --skip-build` Skip build and only serve the files in preview mode.
* `-- --port` (alias `-- -p`) to assign a specific port to run the scene. Otherwise it will use whatever port is available.
* `-- --no-browser` (alias `-- -b`) to prevent the preview from opening a new browser tab.
* `-- -w` or `-- --no-watch` to not watch for filesystem changes and avoid hot-reload whenever the scene's code changes.
* `-- --ci` To run the parcel previewer on a remote unix server.
* `-- --multi-instance` Allow running multiple Explorer instances simultaneously.
* `-- --no-client` Suppress every auto-launch (desktop Explorer deeplink, browser open, mobile QR). The file watcher still notifies a desktop Explorer if it connects on its own. Useful when an external tool owns the Explorer process.
* `-- --mcp` Enable the MCP server in the Explorer (forwarded as a deep link parameter).
* `-- --mcp-port` Port for the MCP server in the Explorer (forwarded as a deep link parameter). For example: `npm run start -- --mcp --mcp-port 3001`.

{% hint style="warning" %}
**📔 Note**: Parameters need to be added with two series of dashes, for example `npm run start -- --web3`.
{% endhint %}

## Upload a scene to decentraland

Once you're happy with your scene, you can upload it and publish it to Decentraland. For this you must own LAND, a Decentraland NAME, or an ETH ENS name, or have permissions given by someone that does. See [publishing](/creator/scenes-sdk7/publishing/publishing) for instructions on how to do that.

## Preview scene size

The scene size shown in the preview is based on the scene's configuration.

Edit this on the second tab of the scene menu in the Scene Editor.

![](/files/VvOOvNR29BEczrlXjudC)

Use the dropdowns and click **Apply Layout** to change the dimensions of your scene. You can also click each individual parcel to toggle it off from your layout.

![](/files/13jWKPxFM1X7Ats3rYgH)

You can also edit the *scene.json* file to list multiple parcels in the "parcels" field. See [set parcels via the command line](/creator/scenes-sdk7/kinds-of-projects/scene-metadata#scene-parcels) for more details.

{% hint style="info" %}
**💡 Tip**: While running the preview, the parcel coordinates don't need to match those that your scene will really use, as long as they're adjacent and are arranged into the same shape. You will have to replace these with the actual coordinates later when you [deploy the scene](#upload-a-scene-to-decentraland).
{% endhint %}

## View the scene console

Open the console by clicking the ![](/files/U3NUJd1Ri2m0ihUjwtiJ) icon on the top-right corner. Here you can see any error messages, and also any text that your scene prints to the console via `console.log()`.

You can also open it by pressing the **\`** key on your keyboard. You can also press Shift + **\`** to open the console even wider, in case you need to view more text.

## Test a multiplayer scene locally

If you launch a scene preview and open it in two (or more) different explorer windows, each open window will be interpreted as a separate player, and a mock communications server will keep these players in sync.

Interact with the scene on one window, then switch to the other to see that the effects of that interaction are also visible there.

Using the Creator Hub, click the Preview button a second time, and that opens a second Decentraland explorer window. You must connect on both windows with different addresses. The same sessions will remain open as the scene reloads.

![](/files/kFXFURDUtsBJrB1sRPNv)

As an alternative, you can open a second Decentraland explorer window by writing the following into a browser URL:

> `decentraland://realm=http://127.0.0.1:8000&local-scene=true&debug=true&multi-instance=true`

### Advanced: Fast iteration with remote asset bundles

For heavy scenes with many 3D models, you can speed up scene loading and reloading by reusing the [asset bundles](/creator/scenes-sdk7/optimizing/performance-optimization#asset-bundle-conversion) that are already published on Decentraland's servers, instead of loading the raw unoptimized 3D models. This is especially useful when iterating on code-only changes.

To enable this mode, launch the Decentraland Desktop client with the following arguments:

```bash
npm run start -- --realm http://127.0.0.1:8000/ --position 0,0 --local-scene true --debug --skip-version-check true --lsd-use-remote-ab <ab-source>
```

The `<ab-source>` argument changes depending on where the scene is already published:

* **In Genesis City**: `--lsd-remote-ab-server Genesis`
* **In a World**: `--lsd-remote-ab-world <world-name>.dcl.eth`

For example, to preview a local copy of a scene that's already deployed to a World:

```bash
npm run start -- --realm http://127.0.0.1:8000/ --position 0,0 --local-scene true --debug --skip-version-check true --lsd-use-remote-ab --lsd-remote-ab-world myworld.dcl.eth
```

In both cases, `--realm http://127.0.0.1:8000/` points the client at your local preview server (run `npm run start` first to start it), and `--local-scene true` tells the client to load the scene's code from there.

{% hint style="warning" %}
**📔 Important**: When using this mode, it's recommended that **all** of its art are already published, with their asset bundles fully processed by the content servers. If you've added any new assets, you'll miss out on the optimized loading as they will be loaded as raw gltf files, as happens when you normally run a preview. But if you locally modified an asset that was already published, maintaining the same file name, then you'll be seeing the old published version of that asset.

In that case, redeploy the scene first, wait for the asset bundles to be generated (see [Asset bundle conversion](/creator/scenes-sdk7/optimizing/performance-optimization#asset-bundle-conversion)), and then resume using this mode for code-only iteration.
{% endhint %}


# Using the CLI

How to use the Decentraland CLI to run, deploy, etc

To build scenes for Decentraland you can either use:

* The [Creator Hub](/creator/scene-editor/get-started/editor-installation)
* The Command Line Interface (CLI)

Both tools allow you to compile and preview your scene in an "off-chain" development environment. After testing your scene locally, you can upload your content to the content server, linking it with your LAND or WORLD.

Although the Scene Editor in the Creator Hub is easier to use, the CLI allows you more flexibility, and can be easily used in automated processes.

{% hint style="warning" %}
**📔 Note**: The Scene Editor runs the same command-line operations behind the curtains.
{% endhint %}

{% hint style="info" %}
**💡 Tip**: See [Installation guide](/creator/scene-editor/get-started/editor-installation) for instructions on how to install the Creator Hub.
{% endhint %}

## Before you Begin

To deal with the scene via the command line, please install the following dependencies before you run CLI commands with the scene:

* [Node.js](https://nodejs.org) (version 20 or later)

## Initiate a new project

Run `npx @dcl/sdk-commands init` on an empty folder to populate it with the default files of a Decentraland [scene](/creator/scenes-sdk7/kinds-of-projects/scene-metadata) project.

To start from a different kind of project, use the `--project` flag. For example, to create a [smart wearable](/creator/scenes-sdk7/kinds-of-projects/smart-wearables) project:

```bash
npx @dcl/sdk-commands init --project smart-wearable
```

The available options for `--project` are `scene-template` (the default), `px-template`, `smart-wearable`, and `library`.

## Update the SDK version of a scene

Run the following command on the scene folder:

```bash
npm i @dcl/sdk@latest
```

You can confirm that it worked by checking the `package.json` file for the scene, and looking for the `@dcl/sdk` version there.

## Run a preview

Run `npm run start` on the root level of a scene, workspace, or smart wearable project to open a preview in the Decentraland Desktop client.

```bash
npm run start
```

To preview your scene on the [Decentraland mobile app](/creator/build-for-mobile/mobile-client/overview) instead, run `npm run start -- --mobile` (alias `-- -m`). The CLI prints a QR code that opens the scene on a phone connected to the same Wi-Fi network as your computer. See [Preview on mobile](/creator/build-for-mobile/develop/preview-on-mobile) for the full guide.

```bash
npm run start -- --mobile
```

See [preview scenes](/creator/scenes-sdk7/getting-started/preview-scene) for details and special options when running a preview.

## Build

Run `npm run build` to build your project. Decentraland scenes are written in TypeScript, but they are built to minified JavaScript when published. See [coding scenes](https://github.com/decentraland/docs-creator/blob/main/sdk7/getting-started/coding-scenes.md) for more details.

The build command is optional, as it also runs in the background before deploying (although you can add a flag to skip it).

The build command runs more rigurous type checks than those that run with `npm run start`, running it can sometimes be helpful to debug a scene.

## Deploy a scene

Run `npm run deploy` to publish your scene to Decentraland. This command opens a browser window where you can sign with your wallet to authorize the deployment.

See [publishing](/creator/scenes-sdk7/publishing/publishing) for details and special options when publishing a scene.

## Troubleshooting

If you run into issues, see the [troubleshooting](/creator/scenes-sdk7/debugging/troubleshooting) section.


# Coding essentials

This set will help you understand how things work in the client and SDK of decentraland.

## The development tools

At a very high level, the Decentraland **Software Development Kit** (SDK) allows you to do the following:

* Generate a default *project* containing a Decentraland scene, including all the assets needed to render and run your content.
* Build, test, and preview the content of your scene locally in your web browser - completely offline, and without having to make any Ethereum transactions or own LAND.
* Write TypeScript code using the Decentraland API to add interactive and dynamic behavior to the scene.
* Upload the content of your scene to the content server.
* Link your LAND tokens to the URL of the content you have uploaded.

Our SDK includes the following:

* **The Creator Hub**: A standalone application that, amongst other things, lets you create scenes with an easy drag-and-drop interface. You can run previews, debug, edit code, and publish. [Read more](/creator/scene-editor/get-started/about-editor)
* **The Decentraland ECS**: A TypeScript package containing the framework of helper methods that allows you to create interactive experiences. Use it to create and manipulate objects in the scene and also to facilitate in-world transactions between players or other applications. ( [latest ECS reference](https://github.com/decentraland/ecs-reference/blob/master/docs-latest/decentraland-ecs.md))
* **Scene examples**: Take inspiration and coding best practices from the [scene examples](https://studios.decentraland.org/resources?sdk_version=SDK7).

Other legacy tools:

* **The Web Editor**: A web based too for creating simple scenes and publishing them.

## Requirements

To develop a scene locally, you don't need to own LAND tokens. Developing and testing a scene can be done completely offline, without the need to deploy a scene to the Ethereum network (the system Decentraland uses to establish ownership of LAND, of a Decentraland Name), or the content server.

You must have:

* **The Creator Hub**: A standalone application that, amongst other things, lets you create scenes with an easy drag-and-drop interface. You can run previews, debug, edit code, and publish. [Read more](/creator/scene-editor/get-started/about-editor).

If you plan to edit the scene's code, you'll also need to install one of the following:

* <img src="/files/jIlOtBcgbGW7g62EK2XS" alt="VS Code" data-size="line"> **Visual Studio Code**: Download it [here](https://code.visualstudio.com/). It helps you write code a lot faster and with less errors. A source code editor marks syntax errors, autocompletes while you write and even shows you smart suggestions that depend on the context that you're in. You can also click on an object in the code to see the full definition of its class and what attributes it supports.
* <img src="/files/h9LKmSXj7ZZZQjtEeiIB" alt="Cursor" data-size="line"> **Cursor AI**: Download it [here](https://www.cursor.com/). A powerful code editor that is integrated with AI. It lets you pick different AI models to help you write code, all of them are free. The AI assistant doesn't just autocomplete as you write, you can also prompt it to refactor a large code base, write documentation, and more.

{% hint style="info" %}
**💡 Tip**: You can use AI assistants like Cursor, OpenDCL, or Claude Code to build entire scenes from plain language descriptions — no TypeScript experience required. See [Vibe Coding with AI](/creator/scenes-sdk7/getting-started/vibe-coding) to get started.
{% endhint %}

## Supported languages and syntax

Decentraland employs [TypeScript (.ts)](https://www.typescriptlang.org/docs/handbook/jsx.html) as the default language for writing scenes.

TypeScript is a superset of JavaScript, so if you're familiar with JavaScript you'll find it's almost the same, but TypeScript includes type declarations. Thanks to type declarations, it's possible to have features like autocomplete better debugging hints, these speed up development times and allow for the creation of a more solid codebase. These features are all key components to a positive developer experience.

When a scene is built, the Typescript code you wrote is compiled into minified Javascript, to make it lighter. The original source code in Typescript is never uploaded to the servers, only the compiled Javascript version.

### Other languages

You can use another tool or language instead of TypeScript and compile it into JavaScript, as long as your compiled scripts are contained within a single JavaScript file matching the path set in the `main` field of your scene's `scene.json` file (by default *bin/index.js*). All provided type declarations are made in TypeScript, and other languages and transpilers are not officially supported.

## Scenes

The content you deploy to your LAND is called a **scene**. A scene is an interactive program that renders 3D content, this could be a game, an interactive experience, an art gallery, whatever you want!

Scenes are deployed to virtual LAND in Decentraland. LAND is a scarce and non-fungible asset maintained in an Ethereum smart contract. Deploy to a single **parcel**, a 16 meter by 16 meter plot of LAND, or to multiple adjacent parcels.

When players visit Decentraland, they download and render the content of each scene as they walk through the map. They unload scenes as they walk away from them.

You can also run a scene locally on your machine by running a preview from the CLI.

## Entities and Components

Three dimensional scenes in Decentraland are based on an [Entity-Component-System](https://en.wikipedia.org/wiki/Entity%E2%80%93component%E2%80%93system) architecture, where everything in a scene is an *entity*. Entities have *components*, each component gives the entity it belongs to specific properties. A door entity is likely to have at least a Transform component (that sets position, rotation & scale) and another to provide it a shape. Components are just a place to store data, they don't carry out any actions by themselves.

![](/files/9numd998mwTOKsAt1iuz)

```ts
export function main() {
	// Create an entity
	const door = engine.addEntity()

	// Give the entity a position via a transform component
	Transform.create(door, {
		position: Vector3.create(5, 1, 5),
	})

	// Give the entity a visible shape via a GltfContainer component
	GltfContainer.create(door, {
		src: 'assets/models/door.glb',
	})
}
```

Entities may be nested inside other entities to form a tree structure. If you're familiar with web development, you might find it useful to think of entities as elements in a DOM tree and of components as the attributes of each of these elements.

![](/files/oDlEEYLPCnGfRhb7d4jw)

Entities are an abstract concept. An entity is just an id, that is used as a reference to group different components.

See [Entities and components](/creator/scenes-sdk7/architecture/entities-components) for an in-depth look of both these concepts and how they're used by Decentraland scenes.

### Custom components

The default set of components (like `Transform`, `GltfContainer`, `Material`, etc) are interpreted by the engine and have direct consequences on how the entity will look, its position, if it emits sounds, etc.

You can also define *custom components* to store data that might be useful to the mechanics in your scene. The engine won't know how to interpret what the values on these components mean, they won't have any direct consequences on how the scene is rendered. However, you can write logic in your scene's code to monitor these values and respond to them. For example, you can define a custom "doorState" component to track the door's open/closed state. In this case, the component is nothing more than a place to store a value that keeps track of this state. To see the door open and close in your scene, you have to then separately implement the logic that uses these values to affect the door's rotation, a value from the `Transform` component that the engine does know how to interpret.

See [Custom Components](/creator/scenes-sdk7/architecture/custom-components) for more information.

### Fetch entities by name

The entities added by dragging and dropping on the Scene Editor in Creator Hub can also be accessed via code to further edit them and add behavior.

Use `engine.getEntityOrNullByName()` to fetch an entity, passing the name assigned to the entity on the Scene Editor UI. Each should have a unique name.

```ts
function main() {
	const door = engine.getEntityOrNullByName('door3')
}
```

You can then do anything you want with that entity, like add new components, modify its existing components, duplicate it or delete it.

See [Get entity by name](/creator/scenes-sdk7/architecture/entities-components#get-an-entity-by-name) for more information.

If the entity is a [Smart item](/creator/scene-editor/interactivity/smart-items), you can also call its **Actions** or subscribe to its **Triggers** via code. See [Reference Items](/creator/scene-editor/extend-with-code/reference-items).

## Systems

Entities and components are places to store information about the objects in a scene. *Systems* hold functions that change the information that's stored in components over time.

Systems are where we implement game logic, they carry out the actions that need to be updated or checked periodically on every tick of the game loop.

A system is a pure and simple function that gets called once on every tick (up to 30 times a second), following the [*update pattern*](http://gameprogrammingpatterns.com/update-method.html).

```ts
// Basic system
function mySystem() {
	console.log('my system is running')
}

engine.addSystem(mySystem)

// System with dt
function mySystemDT(dt: number) {
	console.log('time since last frame:  ', dt)
}

engine.addSystem(mySystemDT)
```

A single scene can have 0 or many systems running at the same time. Systems can be turned on or off at different moments during the scene's duration. It's generally a good practice to keep independent behaviors in separate systems.

See [Systems](/creator/scenes-sdk7/architecture/systems) for more details about how systems are used in a scene.

### The game loop

The [game loop](http://gameprogrammingpatterns.com/game-loop.html) is the backbone of a Decentraland scene's code. It cycles through part of the code at a regular interval and does the following:

* Listen for player input
* Update the scene
* Re-render the scene

In most traditional software programs, all events are triggered directly by player actions. Nothing in the program's state will change until the player clicks on a button, opens a menu, etc.

But interactive environments and games are different from that. Not all changes to the scene are necessarily caused by a player's actions. Your scene could have animated objects that move on their own or even non-player characters that have their own AI. Some player actions might also take multiple ticks to be completed, for example if the opening of a door needs to take a whole second, the door's rotation must be incrementally updated about 30 times as it moves.

We call each iteration over the loop a *tick*. Decentraland scenes are rendered at 30 ticks per second, whenever possible. If the machine is struggling to render each tick, it may result in less frequent updates.

In each tick, the scene is updated; then the scene is re-rendered, based on the updated values.

In Decentraland scenes, there is no explicitly declared game loop, but rather the [Systems](/creator/scenes-sdk7/architecture/systems) of the scene make up the game loop.

The compiling and rendering of the scene is carried out in the backend, you don't need to handle that while developing your scene.

## Querying components

You can [query components](/creator/scenes-sdk7/architecture/querying-components) with the method `engine.getEntitiesWith(...components)` to keep track of all entities in the scene that have certain components.

It often makes sense to query components within a [system](/creator/scenes-sdk7/architecture/systems), to then loop over each of the returned entities and perform a same set of actions on each.

If you attempt to iterate over all the entities in the scene on every tick of the game loop, that could have a significant cost in performance. By referring only to the entities returned by a query, you ensure you're only dealing with those that are relevant.

```ts
// Define a System
function boxHeightSystem(dt: number) {
	// query for entities that include both MeshRenderer and Transform components
	for (const [entity] of engine.getEntitiesWith(MeshRenderer, Transform)) {
		const transform = Transform.get(entity)
		console.log('a box is at height:  ', transform.position.y)
	}
}

// Add the system to the engine
engine.addSystem(boxHeightSystem)
```

## Scene lifecycle

If you start writing loose lines of code directly into `index.ts`, your code may be lacking some important context. For example, you'll be missing information about the player entity, or about entities that were added via drag and drop in the Creator Hub. At the time when your lines of code are read, those things aren't loaded yet.

To avoid that scenario, it's always recommended to write out your scene's initial loading code using the `main()` function (on the `index.ts` file) as an entrypoint. This function runs only after all of the scene's initial context is already loaded, this includes anything added via the Scene Editor UI.

You can write your code outside the `main()` function when:

* The code is indirectly called by `main()`
* The code defines a system, or adds a system to the engine
* The code is inside an [async function](/creator/scenes-sdk7/programming-patterns/async-functions)

{% hint style="warning" %}
**📔 Note**: By the time the code inside an async function or a system is first executed, everything in the scene is already properly initialized.

[Custom Component](/creator/scenes-sdk7/architecture/custom-components) definitions are an exception, these must always be written outside the `main()` function, in a separate file. They need to be interpreted before `main()` is executed.
{% endhint %}

## Mutability

You can choose to deal with mutable or with immutable (read-only) versions of a component. The `.get()` function in a component returns an immutable version of the component. You can only read its values, but can't change any of the properties on it.

The `.getMutable()` function returns representation of the component that allows you to change its values. Use mutable versions only when you plan to make changes to a component. Dealing with immutable versions of components results in a huge gain in performance.

```ts
// fetch an immutable version (read-only)
const immutableTransform = Transform.get(myEntity)

// the following does NOT work:
// 	immutableTransform.position.y = 2

const mutableTransform = Transform.getMutable(myEntity)

// the following DOES change the entity's position
mutableTransform.position.y = 2
```

See [mutable data](/creator/scenes-sdk7/programming-patterns/mutable-data) for more details.

## Putting it all together

The *engine* is what sits in between *entities*, and *components* on one hand and *systems* on the other.

![](/files/kq54sSQwSNy9hwcn0KCr)

All of the values stored in the components in the scene represent the scene's state at that point in time. With every tick of the game loop, the engine runs the functions of each of the systems to update the values stored in the components.

After all the systems run, the components on each entity will have new values. When the engine renders the scene, it will use these new updated values and players will see the entities change to match their new states.

```ts
export function main() {
	// Create an entity
	const cube = engine.addEntity()

	// Give the entity a position via a transform component
	Transform.create(cube, {
		position: Vector3.create(5, 1, 5),
	})

	// Give the entity a visible shape via a MeshRenderer component
	MeshRenderer.setBox(cube)
}

// Define a System
function rotationSystem(dt: number) {
	// query for entities that include both MeshRenderer and Transform components
	for (const [entity] of engine.getEntitiesWith(MeshRenderer, Transform)) {
		const transform = Transform.getMutable(entity)
		transform.rotation = Quaternion.multiply(
			transform.rotation,
			Quaternion.fromAngleAxis(dt * 10, Vector3.Up())
		)
	}
}

// Add the system to the engine
engine.addSystem(rotationSystem)
```

In the example above, a `cube` entity and a `rotationSystem` system are added to the engine. The `cube` entity has a `Transform`, and a `MeshRenderer` component. In every tick of the game loop, the `rotationSystem` system is called, and it changes the rotation values in the `Transform` component of the `cube` entity.

Note that most of the code above is executed just once, when loading the scene. The exception is the `rotationSystem` system, which is called on every tick of the game loop.

## Scene Decoupling

Your scenes don't run in the same context as the engine (a.k.a. the main thread). We created the SDK in a way that is entirely decoupled from the rendering engine. We designed it to be like this for both safety and performance reasons.

Because of this decoupling, your scene's code doesn't have access to the DOM or the `window` object, so you can't access data like the player's browser or geographical location.

The decoupling works by using RPC protocol, this protocol assigns a small part of the client to only render the scene and control events.

We have also abstracted the communication protocol. This allows us to run the scenes locally in a WebWorker.

We don't want developers to intervene with the internals of the engine or even need to know what lies inside the engine. We need to ensure a consistent experience for players throughout the Decentraland map, and mistakes are more likely to happen at that "low" level.

This decoupling is also important to prevent neighbor scenes from interfering with the experience of players while they're on someone else's scene. A player might have multiple nearby scenes loaded at the same time, each running their own code. Some actions (like opening external links, or moving the player) are only permitted when the player is standing on that particular scene, not if the scene is loaded but the player is outside.

## Tree Shaking

When converting the source code in TypeScript to the compiled code in minified JavaScript, the process performs [tree shaking](https://en.wikipedia.org/wiki/Tree_shaking) to ensure that only the parts of the code that are actually being used get converted. This helps keep the scene's final code as lightweight as possible. It's especially useful when using external libraries, since often these libraries include a lot of functionality that is not used that would otherwise bulk up the scene.

As a consequence of tree shaking, any code that you want your scene to run needs to be referenced one way or another by the entry points of your code: the `main()` function on `index.ts`. Systems can also alternatively be added to the engine on the `index.ts` file, without referencing `main()`. Any code that is not explicitly or indirectly referenced by these files, will not make it into the scene.

For example, suppose you have a file named `extraContent.ts` with the following content, the entity will not be rendered and the system will not start running:

```ts
// extraContent.ts

const myEntity = engine.addEntity()
Transform.create(myEntity, {
	position: { x: 8, y: 0, z: 8 },
})
MeshRenderer.setBox(myEntity)

function mySystem(dt: number) {
	console.log('system running')
}

engine.addSystem(mySystem)
```

To make it run as part of your scene, you can reference from `index.ts` in the following way:

```ts
// on extraContent.ts

export function addEntities() {
	const myEntity = engine.addEntity()
	Transform.create(myEntity, {
		position: { x: 8, y: 0, z: 8 },
	})
	MeshRenderer.setBox(myEntity)
}

export function mySystem(dt: number) {
	console.log('system running')
}

/////////////////////////////

// on index.ts

import { addEntities, mySystem } from './extraContent'

export function main() {
	addEntities()
}

engine.addSystem(mySystem)
```

The exception to this rule are the definitions of custom components. These must not be accessed via the `main()` function entry point, as they need to be interpreted before everything else.

## Imports

All functions, objects, components and other elements used by the scene must be imported into each file to use them. This is a consequence of [tree-shaking](#tree-shaking), as it avoids packaging the entire SDK and instead only includes the parts the scene uses.

Snippets throughout the documentation omit the import lines at the start of every file to keep them clean, but for them to work you must add them to the scene.

When Using VS Studio Code to write your scenes, the smart auto-complete options should take care of handling imports for you when you write, without you having to be aware of this.

When you paste a snippet into your scene, however, you will likely see some elements marked in red, which are not imported into that file. To fix this:

* Click on each underlined word
* Click on the light-bulb icon on the left of the line
* Select **Add Import From**
* An import line appears at the start of the file.

![](/files/u5uRenFMKpEWdQIImNui)

If there are many different things to import, you can also select **Add all missing imports** from the same dropdown.

Note that imports must be made to every file where an element is used.

VS Studio Code should be able to resolve the correct paths to your imports on its own. If for whatever reason its having trouble doing that, a trick is to paste the following empty import statements at the start of your file. VS Studio should be able to take it from there.

```ts
import {} from '@dcl/sdk/ecs'
import {} from '@dcl/sdk/math'
```

## SDK Versions

When developing a new scene, you use the `@latest` stable SDK release by default.

You can install the `@next` SDK release if you want to leverage or preview upcoming features that didn't yet make it into the latest stable release.

To do so, open the `package.json` file of your scene, and change the following lines:

```json
  "devDependencies": {
    "@dcl/js-runtime": "next",
    "@dcl/sdk": "next"
  },
```

Then run the following command on your scene project's folder:

```
npm i
```

See [manage dependencies](/creator/scenes-sdk7/libraries/manage-dependencies) for more details.

{% hint style="warning" %}
**📔 Note**: Keep in mind that the @next version might suffer issues from time to time. The syntax and name of new features might change before it's released in a stable version.
{% endhint %}


# Vibe Coding with AI

Use AI assistants to build Decentraland scenes by describing what you want in plain language.

Build Decentraland scenes by describing what you want. An AI assistant handles the SDK7 code, ECS architecture, and project structure for you.

Whether you're a first-time creator or a seasoned developer, AI-assisted "vibe coding" lets you go from an idea to a running scene in minutes instead of hours.

{% hint style="info" %}
**💡 Tip**: You don't need to know TypeScript to get started. AI assistants can generate working scene code from plain language descriptions.
{% endhint %}

## What is Vibe Coding?

Vibe coding means building scenes by having a conversation with an AI assistant rather than writing every line of code by hand. You describe what you want — "a medieval tavern with clickable doors and background music" — and the AI writes correct, deployable SDK7 code.

This approach works at any skill level:

* **Beginners & non-developers** — Go from zero to a working scene without writing code manually.
* **Experienced developers** — Skip the boilerplate. Let the AI handle multiplayer sync, UI scaffolding, and deployment config while you focus on creative decisions.
* **Teams & studios** — Prototype scene concepts quickly before committing full development resources.

## Combine a code editor with AI

Use a general-purpose AI code editor like [Cursor](https://www.cursor.com/) or VS Code with GitHub Copilot or Claude AI. Decentraland provides a context folder so these tools understand the SDK.

1. Open the Creator Hub and create or open a scene.
2. Click the **< > CODE** button to open your code editor.
3. Use the editor's built-in AI assistant (Cursor's chat, Copilot, etc.) to generate or modify code.

## Install Skills for Any AI Agent

Skills are ready-made instruction sets that teach your AI agent how to work with the Decentraland SDK. Each skill covers a specific topic, like creating scenes, adding 3D models, or setting up multiplayer, so the AI already knows the right patterns, APIs, and constraints without you having to explain them. Installing skills means fewer mistakes and better results from the very first prompt.

```bash
# Choose which Decentraland skills to install from an interactive picker
npx skills add decentraland/sdk-skills

# Or install all Decentraland skills
npx skills add decentraland/sdk-skills --all

# Or pick specific skills
npx skills add decentraland/sdk-skills --skill create-scene

# Install globally (available in all projects)
npx skills add decentraland/sdk-skills -g
```

This copies skill files into your agent's configuration so it knows Decentraland patterns and constraints.

## Updating Skills

New skills are added over time, and existing ones are improved. To get the latest versions, re-run the install command with `--all`:

```bash
# Update every installed skill and download any new ones
npx skills add decentraland/sdk-skills --all
```

Running `add` again re-fetches the repository, so it refreshes the skills you already have and installs any that were added since your first install. If you installed skills globally, add `-g` to this command too.

{% hint style="warning" %}
**📔 Note**: Don't use `npx skills update` for this. It only refreshes the skills already on your machine, so any skills added to the repository after your last install are silently skipped. Always use `npx skills add decentraland/sdk-skills --all` instead.
{% endhint %}

## Available AI Skills

When you install skills into your agent, the following capabilities are available:

| Skill                  | What it does                                                        |
| ---------------------- | ------------------------------------------------------------------- |
| `sdk-scenes`           | Entry point with agent guidelines and index of all topic skills     |
| `create-scene`         | Scaffold a new SDK7 scene project from scratch                      |
| `migrate-sdk6-to-sdk7` | Port a legacy SDK6 scene to SDK7                                    |
| `add-3d-models`        | Add 3D models (`.glb`/`.gltf`) with positioning, scaling, colliders |
| `add-interactivity`    | Pointer events, triggers, raycasts                                  |
| `build-ui`             | 2D screen-space UI with React-ECS — HUDs, menus, dialogs            |
| `animations-tweens`    | GLTF model animations with Animator, SDK tweens                     |
| `multiplayer-sync`     | Peer-to-peer multiplayer using CRDT networking                      |
| `authoritative-server` | Headless Multiplayer Server for server-validated scenes (BETA)      |
| `audio-video`          | Sound effects, music, audio streaming, and video players            |
| `audio-analysis`       | Real-time amplitude and frequency data for audio-reactive scenes    |
| `deploy-scene`         | Deploy scenes to Genesis City (LAND-based)                          |
| `deploy-worlds`        | Deploy scenes to Worlds (personal 3D spaces)                        |
| `optimize-scene`       | Performance optimization, scene limits, best practices              |
| `camera-control`       | Camera mode detection, cinematic camera, virtual cameras            |
| `composites`           | Composite file format reference for static scene content            |
| `lighting-environment` | Dynamic lighting, shadows, skybox, fog, environment settings        |
| `particle-system`      | Particle effects — fire, smoke, sparks, snow, fireworks             |
| `npcs`                 | Non-player characters — NPC Toolkit library and manual approaches   |
| `player-avatar`        | Player position, profile, avatar customization, attachments         |
| `player-physics`       | Physics forces — impulses, knockback, continuous forces             |
| `nft-blockchain`       | NFT display and blockchain/crypto interactions                      |
| `advanced-rendering`   | Billboard, TextShape, PBR materials, video materials                |
| `advanced-input`       | System-level input polling and player movement control              |
| `scene-runtime`        | Cross-cutting runtime APIs — async work, HTTP, messaging            |
| `script-components`    | Script component classes for the Creator Hub                        |
| `game-design`          | Game design patterns, scene limits, performance budgets             |
| `unity-explorer-mcp`   | Drive a running Explorer to test and verify a scene in-world        |

Note: Some of these skills involve fetching 3D models or other assets from free asset catalogs. The AI agent should always get confirmation from the user before downloading any new assets to a scene project.

## Let the AI see your scene in-world

Normally the AI writes code and *you* run the preview, look at it, and report back what's wrong. The Decentraland desktop client can close that loop: it ships with an optional **MCP server** that lets an AI agent look at and control the running Explorer directly. The agent takes its own screenshots, reads the scene's console output, walks the player around, clicks on objects, and checks whether the scene actually does what it was asked to build — then fixes what it finds and looks again.

This turns vibe coding from "describe, wait, review" into a loop the agent can run mostly on its own.

{% hint style="info" %}
**💡 Tip**: Install the `unity-explorer-mcp` skill before trying this. It teaches the agent the whole workflow — how to launch the client, how to frame useful screenshots, how to cross-check what it sees against the scene's actual state, and how to recover when the scene stops loading.

```bash
npx skills add decentraland/sdk-skills --skill unity-explorer-mcp
```

{% endhint %}

### What you need

* The **Decentraland desktop client** installed (the same one the Creator Hub launches for previews).
* An AI agent that can connect to MCP servers over HTTP — Claude Code, Cursor, Cline, VS Code with an MCP-capable extension, and others.
* An up-to-date SDK in your scene: run `npm i @dcl/sdk@latest` if the `--mcp` flag below is rejected as an unknown option.

### 1. Launch the scene with the MCP server enabled

From your scene folder:

```bash
npm run start -- --mcp
```

This does what `npm run start` always does — serves your scene at `http://127.0.0.1:8000` and hot-reloads it whenever you save a file — and additionally launches the desktop client with the MCP server listening on `http://127.0.0.1:8123/unity-explorer-mcp`.

Log in when the client opens. The agent can only start working once you're through the login screen and the world has loaded.

### 2. Connect your AI agent to the server

In **Claude Code**, register it once:

```bash
claude mcp add --transport http --scope user explorer http://127.0.0.1:8123/unity-explorer-mcp
```

In **any other MCP client**, add the server the way that client documents, using these details:

| Setting   | Value                                                                                               |
| --------- | --------------------------------------------------------------------------------------------------- |
| Transport | Streamable HTTP (not stdio — there's no command to run, the server lives inside the running client) |
| URL       | `http://127.0.0.1:8123/unity-explorer-mcp`                                                          |
| Auth      | None                                                                                                |
| Name      | `explorer`                                                                                          |

Many clients use a JSON config file for this (`.cursor/mcp.json`, `mcp.json`, and similar — check your client's docs for the exact key names):

```json
{
  "mcpServers": {
    "explorer": {
      "type": "http",
      "url": "http://127.0.0.1:8123/unity-explorer-mcp"
    }
  }
}
```

Restart or reload your AI client after registering the server, so it picks up the connection. If the agent says the Explorer tools aren't available, the usual cause is that the client wasn't running when the agent started — reconnect the server (in Claude Code, run `/mcp`) with the Explorer open.

{% hint style="info" %}
**Is this safe?** The server only runs while you launch the client with `--mcp`, only accepts connections from your own machine (`127.0.0.1`), and rejects requests coming from web pages. Nothing is exposed to the internet, and it's completely off in a normal client launch.
{% endhint %}

### 3. Ask for what you want, and let it verify

With the server connected, ask for work the way you normally would — the difference is that the agent can now check its own results:

> "Add a treasure chest at the center of the parcel that opens when clicked, then walk over and click it to confirm the lid animates."

> "The neon sign looks too dim. Take a screenshot, adjust the emissive intensity, and show me a before/after."

> "Something's wrong with the elevator. Walk onto the platform, watch the logs, and tell me why it doesn't move."

Behind the scenes the agent can:

* **See** — take screenshots, read the scene's `console.log` output and errors, check whether the scene loaded or crashed, list the scene's entities and inspect their components, and read the player and camera position.
* **Control** — move and teleport the player, walk in a direction through real collisions, aim the camera, place a free camera for a specific shot, switch camera modes, click on scene objects, send chat messages and `/commands`, trigger emotes, and reload the scene.

### Tips

* **Ask for proof, not claims.** "Verify with a screenshot" or "confirm from the logs" is what makes this workflow pay off. A good agent cross-checks both: pixels can look right while the underlying state is broken, and the reverse.
* **Screenshots cost tokens.** Each screenshot the agent looks at consumes part of its context. If you want a long visual sweep — an animation over time, a walk-through of many spots — ask it to capture frames to files and only read the ones that matter. The `unity-explorer-mcp` skill ships a script that does exactly this.
* **Save once, not five times in a row.** Rapid successive saves can make the client load a half-written bundle and drop the scene entirely, which needs a client restart to recover. Ask the agent to batch its edits into a single save.
* **Keep the client open.** If you close it, the connection dies and the agent loses its eyes. Relaunching with the same command brings it back.
* **Teleports behave differently in local scene development.** Moving between parcels with `/goto` is disallowed there, so the agent should reposition the player within the scene instead of teleporting.

## Tips for Effective Prompting

Getting the best results from AI is about giving clear, specific prompts. Here are some tips:

### Be specific about what you want

Instead of:

> "Make my scene better"

Try:

> "Add a door at position (8, 0, 8) that opens with a rotation animation when clicked, and plays a creak sound effect"

### Reference existing items

> "Make the red button on the table trigger the elevator to go up"

### Ask for one thing at a time

Break complex requests into steps:

1. "Add a scoreboard UI in the top-right corner"
2. "Add a counter that increases when the player clicks the target"
3. "Display the counter value on the scoreboard"

### Iterate and refine

After each change:

1. Preview the scene (click **Preview** in Creator Hub, or `npm run start` in the command line)
2. Check what works and what doesn't
3. Tell the AI what to adjust: "Move the NPC 2 meters to the left and make it face the player"

### Example prompts

To be ran on a fresh clone of [sdk7-scene-template](https://github.com/decentraland/sdk7-scene-template/).

#### Prompt example 1

```
I want you to scrap the current scene code and make a small simple labyrinth game, in 1 parcel, the walls can be cubes, and they should have collision.

The game should start when the player actually enters the labyrinth on point A and it finishes when he exits on point B (only  exit of the labyrinth).

I want you to add 3 different doors in the maze, that have to be interacted with the pointed input to open them and pass.

You should verify that the player can actually play and win
```

#### Prompt example 2

```
I want you to scrap the current scene code and build a simple platformer game.

You have to verify that the game can be won before considering it finished.
```

## What AI Can Help With

* Scaffolding new scenes from a description
* Adding and positioning 3D models
* Writing click handlers and interactivity
* Building UI (HUDs, menus, dialogs)
* Setting up multiplayer sync
* Configuring the Multiplayer Server for anti-cheat
* Adding audio, video, and streaming
* Creating animations and tweens
* Optimizing scene performance
* Preparing scenes for deployment
* Debugging issues in existing code
* Testing and visually verifying a scene in a running Explorer (see [Let the AI see your scene in-world](#let-the-ai-see-your-scene-in-world))

## Limitations

While AI tools are powerful, keep these in mind:

* **Always preview** — AI-generated code may not look exactly how you expect. Run a preview to verify.
* **Scene limits still apply** — AI cannot bypass Decentraland's [scene limitations](/creator/scenes-sdk7/optimizing/scene-limitations) (triangle counts, file sizes, parcel boundaries).
* **Complex game logic** — For intricate game mechanics, you may need to guide the AI step by step or refine its output manually.
* **Custom 3D models** — AI can reference existing free assets or load models you provide, but it cannot create 3D models from scratch (unless you use other tools like Blender official MCP server at the same time).

## Next Steps

* [SDK Quick Start](/creator/scenes-sdk7/getting-started/sdk-101) — Learn SDK7 fundamentals
* [Combine with Code](/creator/scene-editor/extend-with-code/overview) — Mix visual editing with code
* [Multiplayer Server](/creator/scenes-sdk7/networking/authoritative-servers) — Server-authoritative multiplayer
* [Scene Examples](https://studios.decentraland.org/resources?sdk_version=SDK7) — Browse example scenes for inspiration
* [Useful Resources](/creator/scenes-sdk7/getting-started/useful-resources) — More AI tools, asset libraries, and add-ons to speed up your workflow




---

[Next Page](/llms-full.txt/1)

