One section per release, newest first. Each release has an upgrade section when its steps are not obvious. Releases: v0.4.0, v0.4.0-rc.1, v0.3.0, v0.2.0, v0.1.0.
v0.4.0
Section titled “v0.4.0”Released 2026-10-29.
The Document Database (Firestore-compatible) from v0.4.0-rc.1, released as v0.4.0, and the first release you can install without building from source: archives for Linux, macOS and Windows, and a Docker setup with PostgreSQL 18.
v0.4.0 is released before the checks the release candidate listed under Before v0.4.0 have run: the official Android and iOS suites, the remaining Firebase JS variants, the black-box conformance cases and the conformance suite against a live server in CI, fault injection and load, and the release-wide security review. They continue on this code, and whatever they find is fixed in a v0.4.x release. Until then, the list under Not verified yet in this candidate still applies.
Install
Section titled “Install”- Docker:
compose.yamlruns Aruma and PostgreSQL 18, with the Realtime Database, Storage and the Document Database on. The image is built on your machine from theDockerfile; no image is published to a registry yet. It runs as a non-root user, applies migrations before the server starts, and has the PostgreSQL 18 client tools foraruma backupandaruma restore. See getting started. - Archives:
aruma_0.4.0_<os>_<arch>for Linux and macOS (.tar.gz) and Windows (.zip), on amd64 and arm64, witharuma,arumactland the dashboard inside the binary.checksums.txthas their SHA-256 sums, and each archive has a GitHub build attestation (gh attestation verify). The binaries are not signed by Apple or Microsoft. See operations. - Windows: the server runs, but Cloud Storage does not start on Windows: it needs file locks and disk calls that Aruma implements on Linux and macOS only. Use Docker or WSL for Storage.
make distbuilds the same archives locally, and a pushedv*tag builds and publishes them.
Security
Section titled “Security”- The server and both Admin Auth libraries accept a token only in canonical base64url, so one token has one spelling.
- The Admin Auth libraries refuse a Google address written with a trailing dot (for example
accounts.google.com.).
v0.4.0-rc.1
Section titled “v0.4.0-rc.1”Released 2026-10-28. Release candidate.
A Firestore-compatible database for the official web SDKs (full over WebChannel, lite over REST), the mobile SDKs’ gRPC transport, the Admin SDKs for Node and Go, and firebase-tools, with security rules, a dashboard, and a guide for moving an app over. It is a release candidate: the code is the code planned for v0.4.0, and the verification a final release needs (the official Android and iOS suites, among others) comes after it. What is not verified yet is listed below; read it before you rely on this version.
The service is called Document Database in Aruma, with “Firestore-compatible” under it; the
protocols keep Google’s names (google.firestore.v1). It is off by default.
Evidence is in compatibility, the differences in known differences, and how to move an app in the migration guide.
What ships
Section titled “What ships”Storage and ordering, on the Postgres Aruma already runs on:
- Documents with every value type, including vectors and the BSON shapes production accepts, and a
per-database sequencer that orders every write, so
read_timeand Listen come from one order and not from the clock. - A change log that keeps each document before and after a write, for triggers later.
- One server per database, enforced by an advisory lock on Postgres.
Transactions, queries and indexes:
Get,BatchGet,List(withshow_missing),Create,Update,Delete,ListCollectionIds,Commit,BatchWrite,BeginTransaction,Rollback,RunQuery,RunAggregationQueryandPartitionQueryon(default).- Both transaction models and read-only transactions with
read_time; every query operator, OR, collection-group queries,limitToLast,count,sumandavg; field transforms. - Composite indexes with production’s rule, in three modes:
enforce(production’s error and console link),warnandoff(documents.index_enforcement). Single-field exemptions and TTL policies. - TTL deletes expired documents in the background through the ordinary commit path, so listeners and the change log see the deletion. It runs hourly by default; Google itself promises “typically within 24 hours”.
Listen and Write, on the one public port:
- gRPC (HTTP/2, with or without TLS) for mobile and the Admin SDKs, WebChannel for the full web SDK, and REST for the lite SDK, with production’s credentialed CORS.
- Listen with its full contract: resume, resets, existence filters by count, and
namedQuerybundles. Bounded streams (per project, per address, targets, snapshot size, idle time) with no silent drops: every limit ends in a code the client sees and a counter.
Security rules for Firestore (the engine shipped in v0.3):
service cloud.firestore, withget(),exists()andgetAfter()(10 and 20 lookups) and thelistmodel measured against production.firestore.get()andfirestore.exists()in Storage rules now read the Document Database instead of denying.- A project with no published rules is closed. Rules are published with
firebase deploy --only firestore:rules, the firebaserules API, or the dashboard.
Admin API and Admin SDKs: service-account JWTs as the Node and Go Admin SDKs send
them, and the Admin API firebase-tools calls: databases, indexes, fields with ttlConfig and
vectorConfig, operations. Proved with firebase-tools 15.34.0 under the network guard
(test/acceptance/documents_cli_test.go): deploy --only firestore:indexes and firestore:rules,
firestore:indexes (export), firestore:databases:list and get, firestore:delete -r, and TTL
deleting an expired document. Rules, indexes, exemptions and TTL export and deploy back without
loss.
Web guard (security finding SR3-10, the Firestore part): with Auth on Aruma, @aruma/web refuses requests to Google’s
Firestore host, so the user’s Aruma ID token cannot reach Google through Firestore. Firestore itself
is routed to Aruma at build time (firestore: true for Vite, arumaFirestore for other bundlers,
withArumaFirestore for Next.js and Metro, aruma-web flutter-web --products firestore), or at run
time with arumaFirestoreSettings. See Behaviour changes.
Dashboard: a data browser in three panels (collections, documents, typed fields) with add, edit, delete and recursive delete as the Firebase console does them; the rules editor with version history, errors in line and a Rules Playground; composite indexes, single-field exemptions and TTL policies; and usage by hour: documents read, written and deleted as Firestore bills them, listener and connection peaks, and rules decisions. Every write from the dashboard is audited. In Arabic and English.
Moving an app (guide): pointing each SDK at Aruma, importing indexes from a live project (including those created from console links), rules, TTL, and data.
Evidence, from the last green CI run on main (40678191810, 6b694da):
| Suite | Result |
|---|---|
Web Document Database e2e: full SDK over WebChannel, lite SDK over REST, rules, @aruma/web (Firebase 13) |
21/21 on each of Chromium, Firefox and WebKit |
| firebase-tools 15.34.0 against the Document Database, under the network guard | TestDocumentsWithTheFirebaseCLI passes |
| Document Database SDK smoke: Admin Go, Admin Node over gRPC and REST, JS lite | job passes; no count taken |
| Dashboard unit tests; e2e, visual and accessibility tests in Arabic (RTL) and English | 1665 passed; 226 passed |
| Go: lint, unit, acceptance and isolation tests, with the oracle replays | job passes; no count taken |
| The suites of earlier releases (Auth, Realtime Database, Storage, browser matrix) | all green in the same run |
The production oracle
Section titled “The production oracle”Behaviour is judged against Google’s production, not against the emulator or a reading of the
docs. The corpus in test/oracle/documents/corpus/ (65 files) was recorded on a real Firebase
project, with the Firebase console watched in a browser for the dashboard, and the recordings are
replayed against Aruma in every go test (test/differential/documents). A difference is fixed or
listed in test/oracle/documents/parity-exceptions.json with its reason, and the oracle test fails
when a listed exception names a test that does not exist. There are 24 exceptions: 16 restrictions
(stricter than Firebase on purpose), 7 provisional (a limit or behaviour to revisit) and 1 where the
emulator is wrong and production is followed. Where production was not recorded, the behaviour is marked as a guess.
Changes
Section titled “Changes”- Auth mail and account pages default to English; Arabic stays available as a template language.
@aruma/webnow refuses Google’s Firestore host while Auth is on Aruma. In a browser,fetchandXMLHttpRequesttofirestore.googleapis.comget a403with an explanation, and the Vite plugin fails a build that includes@firebase/firestorewithoutfirestore: true. In Node, DNS, TCP, TLS, HTTP/2 and proxyCONNECTto that host fail with the error codeARUMA_FIRESTORE_BLOCKEDbefore any byte is written, and the Firestore SDK reportsunavailable. An app already on Aruma Auth that also uses Firestore at Google must route Firestore to Aruma or stop using it.- Callable Functions still go to Google and carry the Aruma ID token (security finding SR3-10, the Functions part). An app on Aruma Auth should not use them.
Not verified yet in this candidate
Section titled “Not verified yet in this candidate”Final v0.4.0 depends on these.
- The official Android and iOS Firestore suites, and the mobile host settings. The transport was tried on Android 27.0.1 and iOS 12.19.3, not measured by the full suites. iOS needs a public test domain with a certificate from a public authority: it trusts only its bundled roots, so a self-signed or private-CA certificate cannot connect. Flutter uses the same native libraries.
- Firebase JS 11 and 12 variants of the Document Database suites (the web e2e runs Firebase 13).
- Black-box conformance cases for 19 requirements. They are covered by unit tests and by the replays of the recordings, but not yet by cases run against a running server.
- The conformance suite against a live server in CI.
- Fault injection and load.
- A release-wide security review (security has one for each earlier release). Each part was reviewed as it was built; this version has no review of its own yet.
Not supported
Section titled “Not supported”Each is refused with an explicit error, never ignored.
- Databases other than
(default): answered as production answers a database that does not exist (NOT_FOUND, with the text of each surface); creating, changing or deleting one isUNIMPLEMENTED. Named databases and named rules are planned for v0.4.x. - Import and export through GCS, and managed backups and their schedule. Use Postgres backups.
findNearestand vector search: vector values and indexes are stored;findNearestis answered with production’s error without a matching vector index andUNIMPLEMENTEDwith one.- Query Explain:
explain_optionsisUNIMPLEMENTED. - Bloom filters in Listen: the existence filter carries the count alone.
- Point-in-time recovery, restore and clone;
read_timereads reach back as far as the version window the operator sets. - The Enterprise edition and Pipelines.
firestore:locationsandfirestore:bulkdelete, and editing or deleting databases.- Firestore triggers and Extensions, which need a Functions environment. The change log keeps what they will need.
- A tool to move data from Firebase. Indexes can be exported from a live project with
firebase firestore:indexes; the migration guide covers the rest.
Known differences
Section titled “Known differences”Every difference from production is in test/oracle/documents/parity-exceptions.json with its
reason and its test. The stream limits, which are stricter than Firebase on purpose and adjustable
under documents.limits, are in compatibility. Examples: a query inside a
pessimistic transaction locks the whole collection it reads; transactions open at a restart are
lost; a Listen resumed beyond the version window is answered with a reset; REST answers are compact
JSON; WebChannel answers carry no x-client-wire-protocol header. Usage counters follow Firestore’s
billing rules from its documentation, not from a recording.
Upgrading from v0.3
Section titled “Upgrading from v0.3”- Back up the database (
aruma backup), stop the server, runaruma migrate upwith the new binary (the documents schema, migrations 00001 to 00004: tables, index builds, the instance lock and the hourly usage), and start it. The server refuses to start on an old schema. Migrating does not turn the service on. - Auth, the Realtime Database and Storage need no change.
- The Document Database is off by default. Turn it on with
documents.enabled: true(ARUMA_DOCUMENTS_ENABLED). Everydocuments.*anddocuments.limitskey is in configuration. Two are for local development only, and the server refuses to start with them unlesspublic_urlandlistenare loopback addresses:documents.dev_open_rulesanddocuments.dev_owner_token. - Every project starts with closed Firestore rules. Deploy yours with
firebase deploy --only firestore:rulesor from the dashboard. - Serve gRPC clients through a TLS proxy with a certificate from a public authority, talking h2c to Aruma (guide). iOS will not connect otherwise.
- SDK changes for apps already on Aruma:
- Web: see Behaviour changes. Add
firestore: true(orarumaFirestoreSettings) to any app that uses Firestore.
- Web: see Behaviour changes. Add
- Building from source needs Go 1.27.3 (the
toolchainline ingo.mod).
Before v0.4.0
Section titled “Before v0.4.0”The remaining verification runs on this code: the official Android and iOS suites, the
remaining Firebase JS variants, the black-box conformance cases and the conformance suite against a
live server in CI, fault injection and load, and the release-wide security review. v0.4.0 follows on
the same code once they pass. Whatever they find is fixed in v0.4.0-rc.2, and the affected checks
are run again.
v0.3.0
Section titled “v0.3.0”Released 2026-10-24.
Firebase Security Rules for Storage and Firestore, and Cloud Storage for Firebase for the official SDKs on web, Android, iOS and Flutter, the Admin SDKs for Node and Go, and firebase-tools, with a build-time production path on every platform. Google’s own Storage tests pass against it (145 of 153; every one left is a documented difference), the rules engine agrees with production and the emulator on every counted case of its oracle, and the network guard around the suites saw no request leave the machine.
Evidence is in compatibility, the security review in security, and the differences in known differences.
What ships
Section titled “What ships”Security Rules
- One engine for
firebase.storageandcloud.firestore(Firestore uses it from v0.4), with bounded memory and compile time for any source a project publishes. - The firebaserules v1 API that firebase-tools calls:
:test, rulesets and releases. - A locked default for every project’s Storage:
allow read, write: if false;. firestore.get()andfirestore.exists()compile in Storage rules and deny until v0.4.
Cloud Storage, one default bucket per project on local disk:
- The client API (
/v0): metadata, downloads by rules or token (one Range, streamed gzip, headers that keep uploaded files from running as pages), download URLs, updates, delete, list and listAll, and media, multipart and resumable uploads. - The GCS JSON API for the Admin SDKs, with service accounts only: objects, uploads, downloads,
rewriteTo(copy and move), preconditions, checksums, and bucket CORS. firebase init storageandfirebase deploy --only storage.- The dashboard: a file browser, the Storage rules editor, bucket CORS, and usage and quota.
Evidence, from the last green CI run on main (40111454561, d9391be):
| Suite | Result |
|---|---|
| firebase-js-sdk Storage integration (Node, Chromium) and storage-compat | 13/13, 13/13, 8/8 |
firebase-tools Storage conformance (not emulatorOnly) |
111/119: 6 documented differences, 2 emulator errors |
| Emulator recordings replayed on Aruma | 188 steps, 836 differences, none an Aruma bug, each classified |
| Browser matrix (Chromium, Firefox, WebKit) | 14/14 on each |
Admin SDKs: @google-cloud/storage, cloud.google.com/go/storage |
12/12 and 12/12 |
| Rules oracle: deployed rules, Rules Test API, emulator | 87/87, 3643/3643, 1985/1985, no case more permissive |
The production path per platform
Section titled “The production path per platform”On its production path every platform gets the unified download URL, https://<aruma>/v0/b/<bucket>/o/<path>?alt=media&token=…,
which opens on Aruma in any image loader, player or shared link.
| Platform | Production path (build time) | Fallback (run time) |
|---|---|---|
| Web: Vite 5 to 8, webpack, Rspack, Rollup, esbuild, Next.js (webpack and Turbopack), SvelteKit, Expo (Metro) | @aruma/web with storage: true swaps the SDK’s host when the app is built, and fails the build when it cannot |
installStorage / useArumaStorage |
| Flutter web | aruma-web flutter-web: the pinned firebase-storage.js, swapped once |
as the web |
| Android | Gradle plugin dev.aruma.storage |
aruma-redirect for the Storage host |
| iOS (SwiftPM) | FirebaseStorage from the arumadev mirror, patched for ArumaURL, through swift package config set-mirror; tags pinned in mirror.lock |
ArumaRedirect |
| iOS (CocoaPods) | aruma_storage.rb patches the last releases published there |
ArumaRedirect |
| Flutter (Android, iOS) | the native plugin and mirror, and aruma_storage (fromArumaUrl before refFromURL) |
as native |
| Admin Node | @aruma/admin-storage in place of firebase-admin/storage |
— |
| Admin Go | adminstorage |
— |
A download link from Aruma reads back with refFromURL on the web, Android and iOS, and through
fromArumaUrl on Android, iOS and Flutter (table in compatibility).
Known limits
Section titled “Known limits”- No signed URLs (
getSignedUrland V4 POST policies are refused before anything is signed), and no XML API. Planned after launch. - No named databases and no named Firestore rules, and no tools to move data from Firebase. Planned after launch.
- One bucket per project, one server, local disk (not NFS). ACLs,
makePublic, IAM, notifications, versions,composeand lifecycle rules answer 501, as GCS does for what it does not serve. - App Check headers are accepted and ignored.
- Web apps with Auth on Aruma still send the user’s Aruma ID token to Google from Firestore and
callable Functions (security finding SR3-10). Those services move to Aruma in v0.4; until then such an app should
not use them. Storage is covered: without
storage: truethe web library refuses Storage requests to Google. - Publishing rules in a loop can delay other projects’ first reads (security finding SR3-05, publish pileup): each publish starts a fresh load of its release, and one project publishing and reading in a loop can fill the load turns, so a cold load of another project may wait and answer 503. Decisions and memory are not affected. A fix is planned.
- Rules limits stricter than Firebase on files that are not realistic: the literal patterns of one file share 4 MiB, and one ruleset may weigh a quarter of the compiled-rules cache.
- Turbopack and Metro cannot fail a build that never reached the SDK; the run-time fallback still covers its requests. On plain http browsers send no Fetch Metadata, so the refusal of scripts from the dashboard’s origin rests on its CSP alone: serve Aruma over https off loopback.
- Admin SDKs for Python, Java and .NET, and Unity and C++, are not measured.
- Smaller items deferred from the last reviews: hardening of the CI network guard; two edge cases of
the web SDK guard (it also refuses signed-out Storage requests, and a library that replaces
XMLHttpRequestlater bypasses it); documenting that Android’s strict mode refuses plain download links where the web lets them through; and the iOS build gate checking local edits in package checkouts.
Upgrading from v0.2
Section titled “Upgrading from v0.2”- Back up the database (
aruma backup), stop the server, runaruma migrate upwith the new binary (two migrations: the rules tables and the Storage schema), and start it. The server refuses to start on an old schema. - Auth and the Realtime Database need no change.
- Storage is off by default. To turn it on, set
storage.enabled: true(ARUMA_STORAGE_ENABLED) andstorage.data_dir(ARUMA_STORAGE_DATA_DIR) to an absolute path on a local disk. Everystorage.*andrules.limitskey is in configuration. In short:- the disk must be mounted before Aruma starts (systemd
RequiresMountsFor=). Aruma refuses to boot on an empty directory when the database expects files in it. - the directory belongs to one server and one database.
aruma backupcopies only the database, so back up the directory with it. - a new version replaces the old one by stopping it first. In Kubernetes use
strategy: Recreate: a rolling update waits on the directory’s lock. - serve Storage over https off loopback. Aruma warns at boot when it runs on plain http.
- the disk must be mounted before Aruma starts (systemd
- Every project starts with locked Storage rules. Deploy yours with
firebase deploy --only storageor from the dashboard. - SDK changes for apps already on Aruma:
- Web:
install()from@aruma/webnow refuses Storage requests to Google, and the Vite plugin fails a build that includes@firebase/storagewithoutstorage: true. If the app uses Storage, addstorage: true(orinstallStorage). - Android: with
ArumaStorageRedirect=false,aruma-redirectnow refuses requests to the Storage host instead of letting them reach Google.
- Web:
- Building from source needs Go 1.27.3 (the
toolchainline ingo.mod).
v0.2.0
Section titled “v0.2.0”Released 2026-10-21. Realtime Database.
A Firebase-compatible Realtime Database for the official SDKs on web, Android and iOS, for the Admin SDKs for Node and Go, and for firebase-tools, in production mode and emulator mode. Google’s own database suites pass against it: 332 tests in production mode and 336 in emulator mode.
What ships
Section titled “What ships”- The Realtime Database wire protocol over WebSocket and long polling, and REST at
/<path>.jsonwithout streaming. - Security rules for the database, with a locked default. The whole rules language works except
getPriority(), which is rejected when you save. - One database host per database (
rtdb.domainwith a wildcard DNS record), or?ns=onpublic_urlfor development. - The
firebasetool’sdatabase:*commands anddeploy --only database. - A data browser and rules editor in the dashboard.
- Off by default. Turn it on with
rtdb.enabled: true(ARUMA_RTDB_ENABLED).
Known limits
Section titled “Known limits”- Admin SDK for Python is not supported.
google-authsigns with a fixed audience for Google and sends Aruma’s token toiamcredentials.googleapis.com. - REST streaming (
text/event-stream) is not supported.
See the Realtime Database guide, the operations guide and compatibility.
v0.1.0
Section titled “v0.1.0”Released 2026-10-20. Auth, and the platform under it.
- Projects, apps, API keys, service accounts, the Management API and the dashboard, in one Go binary with PostgreSQL.
- Firebase Auth for the official SDKs on web, iOS, Android and Node, in production mode and emulator mode: Identity Toolkit, Secure Token, the Admin API, identity providers and email actions.
- Redirect libraries that point the official SDKs at Aruma without app code changes.
- The
arumactlcommand line tool and thefirebasetool against the Management API. - Evidence: 27 of 27 priority scenarios, and 180 passing official Firebase JS Auth tests. See compatibility.