> For the complete documentation index, see [llms.txt](https://docs.otherside.xyz/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.otherside.xyz/odk-docs/breaking-changes/v9.3.md).

# v9.3

### Legacy Skin Dependency

Date of change: 15/08/2025

Affected Features: UX Skins

What’s broken and why?

M2 has deprecated their skinning system which the ODK still has dependencies on. This dependency will be removed in a subsequent ODK release.

How to fix it?

When updating your existing ODK project, please add the following entry to `DefaultM2Deprecated.ini`

```
[/Script/JunoCoreUI.J_UISkinsSettings]
bEnableLegacySkinningSystem=True
```

### Domain Check

Date of change: 15/08/2025

Affected Features: Deployment access

What’s broken and why?

Nothing is broken, however we now do a domain check when accessing your world within the web app to ensure that the world you are accessing is pointing to the same domain that you're accessing it from. This is essential to ensure correct functionality of the ODK. If you do access a world that is running on a different domain, you'll see this message. Simply select the "Redirect" button to be taken to the correct domain, and then enter your world.

<figure><img src="/files/QBDOqR5BadI66DiOYHJi" alt=""><figcaption></figcaption></figure>

### Emotes Refactor

Date of change: 15/08/2025

Affected Features: Emotes

What’s broken and why?

The coop emote and standard emote flows have been unified to some degree. There may be more unification work in future. The `BPC_ODK_EmotesComponent` has become the morpheus actor component `BPMC_ODK_EmotesComponent` and now lives on the `BPM_ODK_PlayerCharacterBase`. Some functions have had an API update. Following this documentation should help with those change: <https://docs.otherside.xyz/odk-documentation/documentation/odk-plugin/emotes>

How to fix it?

You will now need to grab the component off the `BPM_ODK_PlayerCharacterBase`.

### Updated allowed avatar collection list

Date of change: 13/08/2025

Affected Features: Avatar management

What’s broken and why?

To unify where allowed avatar collections are retrieved, we've moved the definition into the backend. This means that if you need to modify your avatar collections going forward (outside of Yuga's defaults) then you'll need to request an update to your project.

How to fix it?

Delete any overrides you have for your project.json to `ODK.AvatarSelector.AllowListCollectionContractsArray` , and if you need specific collections filtered for your project, please reach out within your nearest Yuga support channel.

### Token ID management rework

Date of change: 12/08/2025

Affected Features: Token management

What’s broken and why?

To support token management across multiple chains (not just ape chain), we've introduced the concept of an "experience group" that defines what chain + contracts your world should be operating on. This information is provided on startup, and you're able to retrieve it via `BP_ODK_WalletWorldService` as you normally would (previously the information was hardcoded within live config). The one difference is that `TokenIds` themselves will need to be updated dependent on the chain you're operating on. That means that utilities like `BP_GetTokenIDBase` and `BP_GetTokenIDFromLiveConfig` have been updated to be able to provide two token ids (the correct ID will be automatically grabbed dependent on the chain you're operating on).

How to fix it?

For each instance of `BP_GetTokenIDBase` , be aware that you'll need to provide a curtis token id if/when you start operating on curtis. For each instance of `BP_GetTokenIDLiveConfig` , this object now expects an array of two numbers (instead of just a single number). Go through any definitions in live config, and update the schema to provide an array of two numbers. For instance:

```
"TokenIDLiveConfigName": {
	"type": "array",
	"items": {
		"type": "number"
	},
	"default": [1, 8],
	"description": "On apechain, the token is 1. On curtis, it is 8."
}
```

### Project Live Config Location Update

Date of change: 12/08/2025

Affected Features: Live Config

What’s broken and why?

Previously the `project.schema.json` was versioned with project content, and both ODK and project values were added to this single file. This meant whenever you took an ODK update, projects needed to manually merge any new ODK config changes into their `project.schema.json`. We've now split the schema file and it'll be versioned with the ODK plugin itself. This means the `project.schema.json` file is available for exclusive use of the project, and you'll not need to do any manual merging going forward.

How to fix it?

Navigate to your project's project schema file (`<ProjectDir>/Config/LiveConfig/Schemas/project.schema.json`) and remove the "ODK" object blob from the file. If you've not added any of your own live config overrides to the project schema, you can remove the file entirely.

How to test it?

Start a PIE session in editor, and confirm that you see the green "schema generated successfully" toast appear.

<figure><img src="/files/KsHPNAmt61JZ97VnHCRK" alt=""><figcaption></figcaption></figure>

###

### New Bootflow Singleton

Date of change: 12/08/2025

Affected Features: Startup flow

What’s broken and why?

To help simplify the startup logic, we've added a new bootflow singleton that coordinates retriving dynamic world information, and providing it to server/clients as part of the bootflow process.

The singleton is called `BPM_ODK_BootflowSingleton` and currently provides two purposes, but will be extended in future to solidify the ODK bootup experience.

1. Retrieve smart chain contract details and then replicate them out to users. This allows developers to easily switch between different chains + contracts. You can listen for this event in your internal logic by using the `WaitForCondition` node and waiting on `ExperienceDataSet`
2. Retrieve allowed avatar contract list and apply before user avatar is applied. This ensures your clients adhere to the current avatar contract policy deploy by Yuga. You can listen for this event in your internal logic by using the `WaitForCondition` node and waiting on `AllowedAvatarsRetrieved`

How to fix it?

For any previously created levels, please add the `BPM_ODK_BootflowSingleton` to the `AdditionalSingletons` array within the World Settings. For any new levels the singleton will be added automatically.

<figure><img src="/files/SYCCxtKFy5NwcRMKQhiU" alt=""><figcaption></figcaption></figure>

How to test it?

Ensure your bootflow starts correctly, and you're able to apply your set avatar model.

###

### Movement Mode Refactor

Date of change: 29/07/2025

Affected Features: Movement Modes

What’s broken and why?

As part of an effort to make movement modes more extendable and to simplify their structure, some breaking changes have been made. A new movement mode component (`BPC_ODK_MovementComponent`) has been added to the render target to help manage movement modes The main breaking changes are:\
\
\- `BPE_Y_MovementModes` has been removed. Checking for a given movement mode can be done by either querying the new `BPMC_ODK_AnimVarsComponent` MovementMode if needed on non auth clients or `BPC_ODK_MovementComponentBase::GetCurrentMovementModeId` on auth clients.\
\
\- `BPMC_ODK_AnimVarsComponent` has an updated event dispatcher: `OnAnimationMovementModeUpdated`. Ensure any code triggered when the anim vars component updates it's movement mode use this new event dispatcher are fixed up.\
\
\- If you need to change to a movement mode, you can use `BPC_ODK_MovementComponentBase::TrySetMovementMode`.\
\
\- You may need to change update some of your bindings to listening to the new event dispatcher: `BPC_ODK_MovementComponentBase::OnMovementModeUpdated`.\
\
\- If you have custom movement modes, it may be worth converting them to use the new ODK movement mode system. Documentation can be found here: <https://docs.otherside.xyz/odk-documentation/documentation/odk-plugin/movement-modes>

How to test it?

Ensure your logic behaves as it did before these changes.

###

### Improved Mixpanel Analytics to support other data types

Date of change: 17/07/2025

Affected Features: Mixpanel Analytics

What’s broken and why?

To allow support for more data types, in this case Int, Floats and Bools, we have added an enum to the event struct that allows you to tell the API which data type you wish to use.

How to fix it?

If you have existing mixpanel event structs being created (`S_ODK_AnalyticsEventData`), you'll need to open, recompile and save any BP that is creating them. They default to String type, so nothing else will change. However, you may want to take this opportunity to swap any Ints, Floats or Bools over. Just select the type you want from the Make Struct node, then hit the show more arrow at the bottom of the node to reveal the types. Here is an example of each type:

![](/files/a1VuD13QWGVxR3StQrMV)

How to test it?

On you Mixpanel dashboard, you can view your events. If you select "Full JSON" view, you'll see that any event that has been swapped over will now be its correct type.

###

### Removal of BPFL\_ODK\_WidgetHandler.

Date of change: 01/07/2025

Affected Features: UI Mode

What’s broken and why?

The API has been modified to more generic allowing generic uobject context to be used to request UI mode rather than widgets

How to fix it?

Simply use `MarkContextNeedsUIMode` and `UnmarkContextNeedsUIMode` instead of the old library helper fucntions.

How to test it?

Ensure UI mode works as you intended.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.otherside.xyz/odk-docs/breaking-changes/v9.3.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
