react-native-async-storage/async-storage
55.8
Adequate · 25 September 2026
3.7k
lines of production code
TypeScript
with Kotlin, Objective-C, C++, C
5
measurements over time
What this system is
This system is a cross-platform asynchronous storage library for React Native and Expo applications, supporting Android, iOS, and web environments. It provides a unified API for persisting key-value data, featuring a modern multi-database architecture that replaces legacy singleton patterns with scoped instances. The project includes comprehensive tooling, such as build scripts, configuration plugins, and example applications, to facilitate integration and validation across diverse development stacks.
Features
Add Compose Multiplatform and Web examples for Async Storage
This change introduces new example applications for the Async Storage library, providing a Compose Multiplatform app (Android and iOS) and a React web app. The Compose example demonstrates basic UI interactions using MaterialTheme and edge-to-edge display, while the web example offers a tabbed interface to run basic and performance tests against both the new and legacy storage implementations, complete with a test runner view for logging results.
(repo-wide) · high confidence
Async Storage v3: Monorepo migration and new multi-database API
This release introduces Async Storage v3, migrating the project to a monorepo structure with a new Kotlin Multiplatform \shared-storage\ core library for Android and Apple platforms. The API has changed to support multiple named databases via a new \createAsyncStorage(name)\ factory function, replacing the previous single-instance singleton pattern. The legacy Objective-C \RCTAsyncLocalStorage\ implementation has been removed in favor of the new native modules, and the repository now uses Yarn 4 and Turborepo for build orchestration.
(repo-wide) · high confidence
New Expo config plugin for automatic Android repository configuration
A new Expo config plugin, @react-native-async-storage/expo-with-async-storage, has been introduced to automatically configure the local Maven repository for Android builds in managed and bare Expo projects. This plugin adds the necessary repository path to the project's build.gradle file, ensuring that the local artifact is correctly resolved. Note that this plugin is no longer required for Async Storage version 3.1.0 and above, as the artifact is now provided via Maven Central.
packages/expo-with-async-storage · high confidence
New build script for native shared-storage libraries
A new shell script, scripts/build-native-lib.sh, has been added to automate the build and packaging of the shared-storage native libraries for Android and Apple platforms. This script handles assembling the Android AAR and publishing it to Maven Local, as well as building the Apple XCFramework. Notably, it includes specific logic to resolve macOS symlinks within the framework structure to ensure compatibility with npm distribution, addressing issues where compression breaks symbolic links.
scripts · high confidence
New common test app for validating AsyncStorage behavior
The examples/common-tests directory now provides a unified React Native test application to validate the @react-native-async-storage/async-storage library. This app includes a UI with tabs for Basic and Performance tests, supporting both the current API and legacy modes. The Basic tests verify core operations like setting, getting, removing, and clearing single or multiple keys, while Performance tests measure the time taken to save large data sets and handle a large number of keys. The implementation uses a shared test runner infrastructure to log results and handle assertions, ensuring consistent validation across different storage configurations.
examples/common-tests · high confidence
New example applications for iOS, Expo, React Native, and Web platforms
This change introduces new example applications across multiple platforms to demonstrate the library's capabilities. The iOS example (\compose-ios\) is a SwiftUI app that wraps a Kotlin Compose view to perform shared storage operations (set, read, delete). The Expo example (\expo\) is configured with the \@react-native-async-storage/expo-with-async-storage\ plugin and uses the new architecture. The React Native example (\react-native\) is a multi-platform app supporting Android, iOS, macOS, visionOS, and Windows, utilizing \react-native-test-app\ for configuration. The Web example (\web\) is a Vite-based React application using Tailwind CSS. All examples include necessary configuration files (tsconfig, eslint, metro/babel) and boilerplate code to run the \TestApp\ component.
examples · high confidence
Behavioural changes
Added C++ formatting and TypeScript base configuration
The project now includes a \.clang-format\ file to standardize C++ code style based on the LLVM profile, and a \tsconfig.base.json\ file that establishes a strict TypeScript compilation baseline. This base configuration enforces strict type checking, enables source maps and declaration files, and sets the module resolution to Node with CommonJS output, ensuring consistent build behavior across the codebase.
.config · high confidence
Android AsyncStorage migration to Room with WAL and legacy data support
The Android implementation of AsyncStorage has been rewritten to use the Room database library with Write-Ahead Logging (WAL) enabled, replacing the previous storage mechanism. This change introduces a new \LegacyStorageModule\ that automatically migrates existing data from the old \RKStorage\ database file to the new Room schema, ensuring user data is preserved during the upgrade. The new architecture improves thread safety and concurrency by utilizing Kotlin Coroutines and separate dispatchers for read and write operations, while also enforcing stricter SQL standards (such as non-null primary keys) that were previously violated by the legacy implementation.
android, shared-storage · high confidence
Async Storage v3 introduces scoped storage with legacy fallback
Async Storage has been upgraded to version 3, shifting from a global singleton to a scoped storage model where applications must explicitly create storage instances bound to a specific database name via the new \createAsyncStorage\ factory. This change is implemented across the native layers (Android Kotlin, iOS Swift, and JS) using a new \StorageRegistry\ to manage instances and a \SharedStorage\ backend, while the legacy v2 API is preserved behind \legacy\_\ prefixed methods and a \getLegacyStorage\ singleton to ensure backward compatibility during migration.
packages/async-storage · high confidence
Migrate ESLint to flat config format
The ESLint configuration in packages/eslint-config has been updated to use the new flat config format (index.js), replacing the previous structure. This change integrates the @rnx-kit/eslint-plugin recommended rules, enables Prettier with strict error enforcement, and disables specific rules like no-console and react-in-jsx-scope to align with current project standards.
packages/eslint-config · high confidence
Dependencies
Monorepo setup with updated example apps and dependency manifests
The repository has been restructured into a monorepo using Yarn workspaces and Changesets, introducing new dependency manifests (package.json, build.gradle.kts, requirements.txt, Gemfile) for the root, the core async-storage package, and multiple example applications (React Native, Expo, Web, Compose). This update aligns the example apps with React Native 0.79.6 and React 19, upgrades the Android build configuration to AGP 8.10.1 and Kotlin 2.2.10, and pins documentation tooling to MkDocs Material 9.6.20 and Python 3.11.
(dependencies) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Score
- CAI 35 → 56 (+21.1)
- Rubric changed (rubric-2026.08.15 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 64 → 56 (-7.8)
- Architecture 97 → 99 (+2.1)
- Maturity 51 → 50 (-1.1)
- Readiness 17 → 61 (+44.7)
- Security 39 → 58 (+18.6)
Resolved (88)
- Coverage not measured — test suite did not build
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Dimension evaluation failed
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (.github/requirements.txt)
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (.github/requirements.txt)
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (yarn.lock)
- …and 68 more
New (90)
- Coverage not measured — JavaScript/TypeScript suite
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Documentation: no installation or build instructions (README.md)
- Documentation: no usage examples (README.md)
- Duplicated block (45 lines × 2) (packages/async-storage/android/src/newarch/org/asyncstorage/AsyncStorageModule.kt)
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (.github/requirements.txt)
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (yarn.lock)
- …and 70 more
Changes since last survey
- 3 commits — 0 feature/other, 3 fixes
By area
- .changeset/review-build-all.md — 1 commit
- .changeset/review-errors.md — 1 commit
- .changeset/review-mock-reset.md — 1 commit
Notable commits
- fix: fix(build): dispatch both native targets for all (#1340)
- fix: fix(mock): clear held storage instances when resetting (#1339)
- fix: fix: normalize native storage errors without throwing (#1333)
Architecture
- Containers 0 added · 0 removed · contexts 2 added · 0 removed · edges 1 added · 0 removed
Added bounded contexts (2)
- android
- shared-storage
Added dependency edges (1)
- android → shared-storage
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
react-native-async-storage/async-storage was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 25 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit eaa7b60f834d31fb422787c7723081a4dff93de8 — the exact code this score is about.
- Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-dd72cc24c749.