> For the complete documentation index, see [llms.txt](https://docs.coherence.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.coherence.io/support/release-notes.md).

# Release notes

## 2.3

Published 14.10.2026

{% hint style="success" %}
If you're upgrading to 2.3, take a look at the [2.3 Upgrade Guide](/support/upgrading-unity-sdk/upgrade-2.2-greater-than-2.3.md)!
{% endhint %}

**Added**

* Added `ReportsService`, accessible via `CloudService.Reports`, for submitting reports against player accounts for policy violations.
* Gathered schema inspector's filter can now search by object name.
* Added GameCenter authentication support.
* Added `CoherenceBridge.onShutdownNotice` and `CoherenceBridge.ScheduledShutdown`, reporting the UTC time at which the Replication Server has been told (through its `POST /shutdown-notice` API endpoint) that it will shut down, together with an optional human readable reason and an optional game-specific custom payload.
* Added `LobbyData.CreatedAt`.
* Added `FriendsService`, accessible via `CloudService.Friends`, for mirroring the friend list a player keeps on their platform (Game Center, PSN, Nintendo, Xbox, Steam, Epic, or a source your own game provides) into coherence Cloud.
* Added support for reserving lobby slots for players.
* Added `LobbyFilter.WithCreatedAt`, for filtering lobby search results by creation time.
* Added `LobbyPlayer.DisplayName` and `LobbyPlayer.AvatarUrl`.
* New APIs for `LobbyService` and `LobbySession` to invite friends to lobbies, via token or join code.
* Added `Tend.TryWriteHeader`, which reports a full reliable window instead of throwing.
* Added friends online presence via `FriendsService`.
* Added `CreateLobbyOptions.HideFromPresence`.

\
**Changed**

{% hint style="warning" %}

* **Breaking**: `LobbiesService.FindOrCreateLobbyAsync` now names a lobby it creates after `CreateLobbyOptions.Name`, instead of giving it a generated name.
* **Breaking**: `PlayerAccount`'s `Username`, `DisplayName` and `AvatarUrl` are not null but empty strings.
  {% endhint %}

\
**Fixed**

* Fixed the Rooms UI, Worlds UI and Lobbies UI samples not handling UI input in projects that use the Input System package. When they create a missing `EventSystem`, they now add the input module for the active input handling.
* Fixed the Lobbies UI sample shuffling the lobby list. It now keeps the order coherence Cloud returns.
* Fixed `LobbyFilter.WithRegion` and `LobbyFilter.WithRegions` sending an invalid operator (such as `equals` instead of `=`) when used inside `WithAnd` or `WithOr`.
* Fixed `LobbySession` resource leak warnings (`Finalizer ~LobbySession executed without Dispose having been called`).
* Fixed some `OnSuccess` and `ContinueWith` callbacks of `LoginOperation`, `CoherenceTask` and `CloudOperation` running on a thread-pool thread instead of the main thread. Lobby calls made from them, such as rejoining a lobby after logging in, could fail with `An item with the same key has already been added`.
* A lobby response that was read successfully, but could not be applied to its `LobbySession`, is no longer reported as a deserialization error (`ResponseDeserializationException`).
* Fixed a pooled `CommandData` leak in baked code: a command whose arguments could not be written (for example, an argument of the wrong type) was left rented from the pool, and reported as a leak when the client disconnected. Re-bake to pick up the fix.
* The Replication Server no longer logs an error when a connection presents an auth token that is not a well-formed JWT, which happens when a connection request is corrupted in transit. The connection is still rejected with `InvalidChallenge`, and the rejection is logged at info level.
* Fixed the Replication Server terminating when a connection's reliable send window filled up, which happens when a client stops acknowledging packets. Reliable out-of-band messages are now held until the window reopens, a connection that cannot drain them is disconnected, and a failing connection or room tick is contained instead of taking the whole server down.
* Fixed every connection to a client-hosted Replication Server being denied with `InvalidChallenge` on consoles, iOS and Android. Newtonsoft.Json builds `JWT.Builder.JwtHeader` reflectively while decoding a token, so IL2CPP managed stripping (High by default on those platforms) removed the members it needs and no auth token or unlock token could be decoded. `Coherence.JWT` is now preserved from stripping.
* The Replication Server now verifies the auth token signature on all platforms again. On Unity-hosted servers it had been reduced to reading the token's subject without validating it, as a workaround for the stripping issue above.
* Fixed a component leak when an entity whose prefab is not yet resolved arrives more than once under the same unique id, which happens to a prefab sync group member that leaves and re-enters a client's view. The components of the earlier arrival were dropped without being returned to the pool.
* Fixed `ClientCore.ConnectionState` so it now reports `Opening` while the host name is being resolved, where it previously reported `Disconnected`.
* A client that closes a connection after sending its connect request, but before the Replication Server has accepted it, now tells the Replication Server. The Replication Server previously held such a connection until it timed out, where enough of them could fill the room.
* A login that completed after its `PlayerAccount` or `AuthClient` was disposed no longer throws a `NullReferenceException`, and no longer places the disposed account back into `PlayerAccount.All`. The login task now completes as canceled instead.
* Fixed `RoomData.KV` always being `null` (and `RoomData.RoomName` always being empty).
* Fixed `MissingReferenceException` failing the bake when a registered networked prefab has been destroyed mid-session (e.g. deleted and re-created without a domain reload). Such configs are now skipped.
* Fixed coherence Cloud messages that arrive while a client is briefly disconnected (such as lobby updates and invites) being silently dropped instead of delivered once the connection is back.
* Fixed `PlayerAccountId.GetHashCode()`, `CloudUniqueId.GetHashCode()`, and `GuestId.GetHashCode()` not agreeing with their `Equals`: a default-initialized instance (backing field `null`) is equal to `.None` (backing field `""`).
* Fixed the coherence Cloud connection being silently evicted when the same player account logs in from a second client: `AuthClient.OnError` now raises a `LoginError` whose `Type` is `ErrorType.ConcurrentConnection` (with its existing player-facing message) instead of a generic `ErrorType.ServerError`, and a warning is now logged.
* Fixed `AuthClient` login failures during the initial connection (WebSocket timeout, connection error) not being logged as warnings even though a `Warning` id was passed for them. Ordinary login failures (invalid credentials, invalid input, etc.) remain silent at this level, matching existing behavior.
* Fixed a `UnauthorizedAccessException` intermittently thrown while writing `Gathered.schema` on Windows, caused by the asset database's importer still holding the file open from a previous asynchronous import.
* Fixed `WebSocketManager` being able to end up permanently disabled after a `/connection/reconnect` push, silently degrading the client to plain HTTP requests for the rest of the session.
* Fixed baked command extension methods failing to compile when a command parameter is named `self`, `target`, or `sync`, colliding with the generator's own reserved identifiers (now `_self`, `coherenceMessageTarget`, and `__sync`).
* Fixed `OnSuccess` callbacks on cloud operations running on a background thread.
* Fixed the Dissonance Integration sample dropping all unreliable voice packets on a client whose system clock is set more than a few seconds ahead of the other players'. Voice packets are now timestamped with coherence's network time instead of `DateTime.UtcNow`, so the stale-audio check measures transit time rather than the gap between two machines' clocks.
* Fixed cloud request cooldowns, connection timeouts, WebSocket reconnect backoff and authority request timeouts never elapsing while the game is paused, and running slow while `Time.timeScale` is below 1, on Unity 6+.
* Refreshing or re-joining a lobby no longer creates another `LobbySession`, and is instead updated in place.
