TL;DR

Google has shipped Room 3.0 alpha (current version 3.0.0-alpha03, April 8, 2026), the biggest breaking update to Android's persistence library since it launched. The library now lives under a brand-new androidx.room3 Maven group, generates only Kotlin, runs only on KSP (no more KAPT), is coroutine-first (DAOs are suspend by default), and finally targets JavaScript and WebAssembly alongside Android, iOS, and JVM desktop. Room 2.x is now in maintenance mode.

Room 3.0 announcement banner from Android Developers Blog

What's new

Posted by Daniel Santiago Rivera on the Android Developers Blog, Room 3.0 is described as a major version aligned with the Kotlin Multiplatform (KMP) ecosystem. The release timeline so far:

  • Mar 11, 20263.0.0-alpha01 (initial release).
  • Mar 25, 20263.0.0-alpha02 (FTS5 full-text search via @Fts5; js, wasmJs, tvOS, and watchOS targets added to room3-paging).
  • Apr 8, 20263.0.0-alpha03 (bug fixes, including a JVM/Android "code too large" fix in generated schema validation).

The core annotation surface stays familiar — @Database, @Entity, @Dao, @Query — but everything underneath has been rewritten.

Why it matters

Room has been Android's default ORM for years, but it was always tied to Android's SupportSQLite APIs and Java's annotation processor. That made it painful to share database code across iOS or web. Room 3.0 removes both of those anchors at once: the SQL backend is now the KMP-compatible androidx.sqlite driver, and code generation is fully Kotlin via KSP. The result is a single persistence layer that can run inside an Android phone, an iOS app, a JVM desktop tool, or a browser tab backed by the Origin Private File System.

Technical facts

The big breaking changes:

AreaRoom 2.xRoom 3.0
Maven groupandroidx.roomandroidx.room3
Code generationJava + KotlinKotlin only
Annotation processorKAPT or KSPKSP only
SQLite backendSupportSQLite (Android-only)androidx.sqlite SQLiteDriver (KMP)
DAO styleBlocking + optional asyncCoroutine-first, suspend by default
Threading configsetQueryExecutor()setCoroutineContext()
TargetsAndroid, JVM, iOS (preview)+ JS, WasmJS, tvOS, watchOS

A few specifics worth flagging:

  • DAO functions must be suspend in KMP common code unless they return a reactive type like Flow or a custom return type. Blocking DAO functions are disallowed.
  • SQLite drivers are pluggable: BundledSQLiteDriver (recommended, ships SQLite from source for cross-platform consistency), AndroidSQLiteDriver, NativeSQLiteDriver (iOS, requires the -lsqlite3 linker option), and WebWorkerSQLiteDriver (web, OPFS-backed) in the new androidx.sqlite:sqlite-web artifact.
  • InvalidationTracker.Observer is removed — reactive change tracking now goes through InvalidationTracker.createFlow().
  • New @DaoReturnTypeConverter annotation lets developers register custom DAO return types. The Paging, RxJava, Guava, and LiveData integrations have all been migrated to this mechanism, distributed as room3-paging, room3-rxjava3, room3-guava, and room3-livedata artifacts.

Web support and migration

The web story is the headline-grabber. Room 3.0 ships WebWorkerSQLiteDriver, a Web Worker–based driver that persists databases in the browser's Origin Private File System (OPFS). Because web storage is inherently asynchronous, every API that took a SQLiteStatement argument is now a suspend function — that includes Migration.onMigrate(), RoomDatabase.Callback.onCreate(), and PooledConnection.usePrepared().

For migrations, Google's recommended path is to move to SQLiteDriver APIs first while still on Room 2.7+, then bump to Room 3.0 — at which point the change is mostly an import rewrite from androidx.room.* to androidx.room3.*. For projects that still need SupportSQLiteDatabase for legacy code, the androidx.room3:room3-sqlite-wrapper artifact provides a temporary bridge via roomDatabase.getSupportWrapper().

Use cases

  • Cross-platform teams sharing offline-first business logic across Android and iOS without writing two SQLite layers.
  • Compose for Web / Kotlin/Wasm developers needing relational, browser-persistent storage off the main thread.
  • Multi-form-factor apps targeting Wear OS, tvOS, or watchOS — room3-paging now supports all of these.
  • Android-only teams still benefit: dropping KAPT in favor of KSP typically means meaningfully faster build times.

Limitations & pricing

It's still alpha — breaking changes between alphas are likely, and this is not a production target yet. Several Room 2.x features are not yet available in KMP common code: setQueryCallback, setAutoCloseTimeout, pre-packaged databases (createFromAsset/File/InputStream), and multi-instance invalidation. Google plans to bring most of these back. The WebWorkerSQLiteDriver currently has no default worker — developers must wire a local NPM package implementing the protocol; the androidx codebase ships an example. Kotlin 1.9.x users need kotlin.native.disableCompilerDaemon = true in gradle.properties for KSP to work; this is fixed in Kotlin 2.0+. Room is free and open source under AndroidX.

What's next

Room 2.x has officially entered maintenance mode — only patch releases on top of 2.8.0 with bug fixes and dependency updates, until Room 3.0 reaches stability. The roadmap mentions restoring query callbacks, pre-packaged databases, and multi-instance invalidation in common code, plus shipping a default Web Worker via NPM to remove the manual setup step.

If you maintain anything talking to SQLite on Android, the practical advice is simple: start the SQLiteDriver migration on Room 2.7+ now, isolate Room into a Kotlin/KSP module, and you'll be ready to flip the import switch when 3.0 stabilizes.

Sources: InfoQ, Android Developers Blog, Room 3.0 release notes, Room KMP setup guide.