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

# Upgrade to v2.3.0

> Capability changes, quota migration, and validation steps.

v2.3.0 lets your app choose its Settings, account, auth, and paywall surfaces
while shared packages keep their state and service logic. It also adds typed
record storage and fixes quota enforcement, record loading, chat navigation,
and accessibility identifiers.

## Before updating

Commit or back up your app changes. Compare your fork with the `v2.3.0` tag
and merge on an upgrade branch. Do not replace your app-owned screens with the
sample wrappers. Keep your bundle ID, branding, service settings, and secrets.

Use Xcode 26.2 or newer, the iOS 26 SDK, and Swift 6 strict concurrency. The
runtime minimum remains iOS 17. Release tests cover iOS 26.2 and iOS 18.6;
that does not claim an iOS 17 device test.

## Apply the AI quota migration

If your backend uses the AI endpoint, review and apply
`supabase/migrations/20261002000000_lock_ai_rate_limit_policy.sql` through your
normal database migration process before exposing that endpoint to clients.
Apply earlier migrations in order on a new backend. Back up existing data and
check the change in staging first.

The RPC still accepts the same arguments, but only permits the server policy:
60 requests per 3,600 seconds. An authenticated caller cannot choose a shorter
window or raise the limit. Anonymous execution is removed. A custom policy
requires a reviewed change to both the database function and edge function.
Pulling source does not apply a migration to your hosted database.

## Merge the capabilities you use

| Area | Change to review | Guide |
| - | - | - |
| Settings | Select capability descriptors and compose app-owned sections; keep SettingsViewModel for shared actions. | [FeatureSettings](https://docs.swiftaiboilerplate.com/pages/modules/feature-settings.md) |
| Account and auth | Keep session, validation, update, and deletion logic in Auth. Your app owns routes and screen copy. | [Auth](https://docs.swiftaiboilerplate.com/pages/modules/auth.md) |
| Paywall | Keep offerings, purchase, restore, and entitlement state in Payments. Your app owns benefits and placement. | [Payments](https://docs.swiftaiboilerplate.com/pages/modules/payments.md) |
| Records | Use one CodableRecordStore instance per file, injected through CompositionRoot. | [Storage](https://docs.swiftaiboilerplate.com/pages/modules/storage.md) |
| Profile photos | Configure the selected bucket and row-level policies before enabling uploads. | [Profile photos](https://docs.swiftaiboilerplate.com/pages/guides/profile-photos.md) |
| Chat sync | Adopt the identity-preserving protocols; keep conversation, message, and relationship IDs stable. | [Chat sync](https://docs.swiftaiboilerplate.com/pages/guides/chat-sync.md) |

Keep explicit capability choices in CompositionRoot. Remove unused features
and their routes instead of adding a second service stack. The new record
store suits small datasets: each write encodes the full collection. Use the
existing database repositories when you need queries or larger datasets.

## Verify your app

Run your fork's tests and strict lint after the merge. Check New Chat navigation,
stream cancellation, saved records after restart, account actions, purchase and
restore, and any enabled sync or photo upload. Compare light and dark screens
and large text sizes. Keep your own snapshot references and review differences.

Before App Store submission, follow the [4.3 checklist](https://docs.swiftaiboilerplate.com/pages/guides/app-store-4-3-hardening.md).
The starter app's passing checks do not test your live service accounts or
guarantee App Store approval. Keep private provider keys out of client config.

## Evidence and design

See [release validation](https://github.com/SwiftAIBoilerplatePro/SwiftAIBoilerplatePro-Distribution/blob/v2.3.0/docs/checklists/RELEASE_2_3_0.md) for the tested commit,
runs, counts, and coverage. The [technical article](https://www.swiftaiboilerplate.com/blog/boilerplate-v2-3-composable-swiftui)
explains the design choices and their limits. App Generator has a separate
release process; this upgrade does not require it.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.