# 4. Discovery, Trust, and Updates
Part of [[Modding with Addressables]]. Prev: [[3. LoadContentCatalogAsync]]. Next: [[5. Worked Example Cosmetic Pack]].
## 4.1 Where the path comes from
A classroom pack path should be **yours**:
- An HTTPS URL on a server the class controls (or CCD, if you follow current CCD docs — the Addressables series did not stand up a live bucket).
- A file next to the player, or a path the user picked from a **known folder**.
Prefer **HTTPS**. Player Settings already has an "Allow downloads over HTTP" policy on several platforms; do not casually set it to Always Allowed to "make mods work."
Do not treat an arbitrary pasted URL as a completed feature. A catalog and its bundles can include large payloads and unexpected assets. This course still cannot execute *new* C# from the pack, but a huge download or a confusing prefab is enough to ruin a session.
## 4.2 Failed loads are normal
Show a retry, continue without the pack, and do not block the bootstrap scene. The existing remote-content advice in [[5. Scenes Catalogs and Remote Content]] still holds: optional cosmetics, not the first gameplay door, on a first lab.
## 4.3 Updating catalogs (official)
If a hash file is available, Unity checks it when loading. You can disable automatic checks with the official **Only update catalogs manually** setting and call the official APIs (2.9.1 manage-catalogs manual). Official sample names:
```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.ResourceManagement.ResourceLocations;
IEnumerator CheckCatalogs()
{
var checkForUpdateHandle = Addressables.CheckForCatalogUpdates();
yield return checkForUpdateHandle;
List<string> catalogsToUpdate = new List<string>();
if (checkForUpdateHandle.Status == AsyncOperationStatus.Succeeded)
catalogsToUpdate.AddRange(checkForUpdateHandle.Result);
if (catalogsToUpdate.Count > 0)
{
var updateHandle = Addressables.UpdateCatalogs(catalogsToUpdate);
yield return updateHandle;
updateHandle.Release();
}
checkForUpdateHandle.Release();
}
```
Or `Addressables.UpdateCatalogs()` with no list — official: checks **all** loaded catalogs. Official: `UpdateCatalogs` **blocks other Addressable requests** until it finishes. Release its handle (or pass the official auto-release parameter if you use that overload — confirm in 2.9.1 IntelliSense).
If you loaded a catalog with `LoadContentCatalogAsync`, **release that handle** before updating (part 3). That is why `autoReleaseHandle: true` matters.
### Already-loaded bundles
Official important note: updating a catalog while related AssetBundles are **already loaded** can conflict. Official mitigations: enable **Unique Bundle IDs** in Addressable settings (more bundles to rebuild on a content update), or unload content that must be updated (can be slow). Read [[6. Content Builds Updates and CI]] before you turn Unique Bundle IDs on in a Quest lab.
## 4.4 Exercise
Write the player-facing copy for "cosmetic pack failed to load" and "a newer pack is available." Implement the failure path for a deliberately wrong catalog path. Do not call `UpdateCatalogs` in `Update`.
## Sources
- https://docs.unity3d.com/Packages/
[email protected]/manual/LoadContentCatalogAsync.html