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

# July 28, 2023

> The latest updates to Daily's real-time audio and video APIs.

## Overview

Highlights include:

* `daily-ios` adds support for Adaptive HEVC (H.265 and H.264) streaming via a new `iOSOptimized` publishing encoding mode.
* In `daily-android`, `daily-ios`, and `daily-react`, you can now modify a user's admin permissions from within a call using the new `canAdmin` permission.
* `daily-android` and `daily-ios` both add support for `staged` subscriptions. Using `staged` subscriptions, allows your app to remain performant while also being able to increase the participant count. Learn more in our [best practices guide](/docs/guides/scaling-calls/best-practices-to-scale-large-experiences#track-subscriptions).

## daily-android

### 0.9.0

#### Admin permissions

Admin permissions can now be configured prior to joining a meeting or dynamically from within a meeting. This new permission can be controlled through the [updatePermissions](https://reference-android.daily.co/daily-android/co.daily/-call-client/update-permissions.html) method.

#### Release notes

For more information, check out the [release notes](https://github.com/daily-co/daily-client-android/blob/main/CHANGELOG.md#090---2023-07-27).

## daily-ios

### 0.9.0

#### Adaptive HEVC

Deliver higher quality video using less bandwidth and CPU with Daily's Adaptive HEVC feature, available only on iOS. When enabling the `iOSOptimized` mode for a call, your daily-ios client will send both a high quality HEVC (also known as H.265) encoded video stream and a medium and low quality H.264 encoded video stream. This setting will ensure your application delivers a high-quality, efficient stream to iOS devices while still remaining cross-platform compatible by sending H.264 streams to other clients.

This feature is available as an updatePublishing encoding mode:

```
call.updatePublishing(.set(
  camera: .set(
    isPublishing: .set(true),
    sendSettings: .set(
      maxQuality: .set(.high),
      encodings: .set(.mode(.iOSOptimized))
    )
  )
))
```

#### Admin permissions

Admin permissions can now be configured prior to joining a meeting or dynamically from within a meeting. This new permission can be controlled through the [updatePermissions](https://reference-ios.daily.co/documentation/daily/callclient/updatepermissions\(_:completion:\)) method.

#### Release notes

For more information, check out the [release notes](https://github.com/daily-co/daily-client-ios/blob/main/CHANGELOG.md#090---2023-07-27).

## daily-react

### 0.11.0

#### Features

* New handling of `canAdmin` permissions in [`usePermissions`](/reference/daily-react/use-permissions): the hook now returns `canAdminParticipants`, `canAdminStreaming` and `canAdminTranscription` in addition to the other permission fields. Read more about `canAdmin` in [our docs](/reference/daily-js/instance-methods/update-participant#param-update-permissions).
* New hook [`useCPULoad`](/reference/daily-react/use-cpu-load): this hook keeps track of the CPU load state and reason (see [`getCpuLoadStats()`](/reference/daily-js/instance-methods/get-cpu-load-stats)) via [`'cpu-load-change'`](/reference/daily-js/events/network-events#cpu-load-change) events.
* New hook [`useRoomExp`](/reference/daily-react/use-room-exp): this hook determines the meeting ejection date for the local participant, based on [`eject_after_elapsed`](/reference/rest-api/rooms/get-room#response-config-eject-after-elapsed), [`eject_at_room_exp`](/reference/rest-api/rooms/get-room#response-config-eject-at-room-exp) and [`exp`](/reference/rest-api/rooms/get-room#response-config-exp) room/token configuration.

#### Improvements

* Improved rendering performance of [`useParticipantIds`](/reference/daily-react/use-participant-ids) and [`useParticipantProperty`](/reference/daily-react/use-participant-property): previously both hooks subscribed to all participant objects stored in the recoil state. This led to a lot of unexpected render cycles, e.g. `useParticipantIds({ filter: 'remote' })` would re-render when the local participant toggled their cam or mic. We've restructured the way we store and subscribe to changes in participant objects to achieve only targeted re-renders. Every instance of `useParticipantIds` now sets up its own local state of returned ids, and only updates the state when the resulting array of ids doesn't match the previously stored one. To keep the connection to the recoil state store, we're now using the [`useRecoilTransactionObserver_UNSTABLE`](https://recoiljs.org/docs/api-reference/core/useRecoilTransactionObserver) hook which worked flawlessly in our internal tests. Please be aware that with this change we've introduced at least 1 additional render cycle per `useParticipantIds` to initialize the state.
