---
description: Capacitor Firebase 8.3.0 adds new Firestore data types, filtered count queries, a serverTimestamps listener option, and Remote Config setDefaults and getAll.
title: What's New in Capacitor Firebase 8.3.0 - Capawesome
image: https://capawesome.io/docs/assets/images/social/blog/capacitor-firebase-8-3-0-release.png
---

[ Skip to content](#whats-new-in-capacitor-firebase-830) 

[ 🔐 Introducing the **Capacitor Vault** plugin — store secrets behind biometrics or a device passcode.](/blog/announcing-the-capacitor-vault-plugin/) 

* [  Formbricks ](/docs/plugins/formbricks/)
* [  Geocoder ](/docs/plugins/geocoder/)
* [  Google Sign-In ](/docs/plugins/google-sign-in/)
* [  Grafana Faro ](/docs/plugins/grafana-faro/)
* [  libSQL ](/docs/plugins/libsql/)
* [  Live Update ](/docs/plugins/live-update/)
* [  Managed Configurations ](/docs/plugins/managed-configurations/)
* [  Media Session ](/docs/plugins/media-session/)
* [  ML Kit ](/docs/plugins/mlkit/)
* [  Navigation Bar ](/docs/plugins/navigation-bar/)
* [  NFC ](/docs/plugins/nfc/)
* [  OAuth ](/docs/plugins/oauth/)
* [  Pedometer ](/docs/plugins/pedometer/)
* [  Photo Editor ](/docs/plugins/photo-editor/)
* [  PostHog ](/docs/plugins/posthog/)
* [  Printer ](/docs/plugins/printer/)
* [  Purchases ](/docs/plugins/purchases/)
* [  RealtimeKit ](/docs/plugins/realtimekit/)
* [  Screen Orientation ](/docs/plugins/screen-orientation/)
* [  Screenshot ](/docs/plugins/screenshot/)
* [  Secure Preferences ](/docs/plugins/secure-preferences/)
* [  Speech Recognition ](/docs/plugins/speech-recognition/)
* [  Speech Synthesis ](/docs/plugins/speech-synthesis/)
* [  Share Target ](/docs/plugins/share-target/)
* [  Square Mobile Payments ](/docs/plugins/square-mobile-payments/)
* [  SQLite ](/docs/plugins/sqlite/)
* [  Superwall ](/docs/plugins/superwall/)
* [  Torch ](/docs/plugins/torch/)
* [  Vault ](/docs/plugins/vault/)
* [  Wifi ](/docs/plugins/wifi/)
* [  Zip ](/docs/plugins/zip/)
* [  Cloud ](/docs/cloud/)
* [  Live Updates ](/docs/cloud/live-updates/)
* Advanced
* Integrations
* [  Native Builds ](/docs/cloud/native-builds/)
* [  Configuration ](/docs/cloud/native-builds/configuration/)
* [  Environments ](/docs/cloud/native-builds/environments/)
* Guides
* [  Sample Projects ](/docs/cloud/native-builds/sample-projects/)
* [  Troubleshooting ](/docs/cloud/native-builds/troubleshooting/)
* [  Automations ](/docs/cloud/automations/)
* [  Assist ](/docs/cloud/assist/)
* Account
* Organizations
* [  Organization and User Management ](/docs/cloud/organizations/memberships/)
* [  Single Sign-On (SSO) ](/docs/cloud/organizations/sso/)
* [  Teams ](/docs/cloud/organizations/teams/)
* [  Two-Factor Authentication ](/docs/cloud/organizations/two-factor-authentication/)
* [  Integrations ](/docs/cloud/integrations/)
* [  License Keys ](/docs/cloud/license-keys/)
* [  Webhooks ](/docs/cloud/webhooks/)
* [  Pricing ](https://capawesome.io/pricing/)
* [  FAQ ](/docs/cloud/faq/)
* [  Support ](/docs/cloud/support/)
* [  Contributing ](/docs/contributing/)
* [  LLMs ](/docs/llms/)
* [  Insiders ](/docs/insiders/)
* [  License ](https://capawesome.io/legal/eula/)
* [  Support ](/docs/insiders/support/)
* [  FAQ ](/docs/insiders/faq/)
* [  Blog ](/blog/)
* Categories

* [  Remote Config ](#remote-config)
* [  Upgrading ](#upgrading)
* [  Final Thoughts ](#final-thoughts)

# What's New in Capacitor Firebase 8.3.0[¶](#whats-new-in-capacitor-firebase-830 "Permanent link")

Capacitor Firebase 8.3.0 is out, and the work is split across two plugins. Cloud Firestore gains support for data types it used to mangle — `DocumentReference`, `Bytes`, and `NaN`/`Infinity` — along with filtered count queries and a `serverTimestamps` option on snapshot listeners. Remote Config picks up `setDefaults(...)`, `getAll()`, and a `source` field that finally works on the web.

[ ![Build and deploy your Capacitor app with Capawesome Cloud](../../assets/external/cloud.capawesome.io/assets/banners/cloud-build-and-deploy-capacitor-apps.69628c3f.png) ](https://capawesome.io/) 

## At a Glance[¶](#at-a-glance "Permanent link")

Here's the full list of changes in this release:

| Change                                              | Plugin              | Platforms           | PR                                                                     |
| --------------------------------------------------- | ------------------- | ------------------- | ---------------------------------------------------------------------- |
| DocumentReference, Bytes, NaN/Infinity data types   | Firestore           | Web + iOS + Android | [#991](https://github.com/capawesome-team/capacitor-firebase/pull/991) |
| Queries in getCountFromServer(...)                  | Firestore           | Web + iOS + Android | [#988](https://github.com/capawesome-team/capacitor-firebase/pull/988) |
| serverTimestamps option on snapshot listeners       | Firestore           | Web + iOS + Android | [#993](https://github.com/capawesome-team/capacitor-firebase/pull/993) |
| limitToLast constraint fixed on Android             | Firestore           | Android             | [#992](https://github.com/capawesome-team/capacitor-firebase/pull/992) |
| Unique listener IDs to prevent overwrites           | Firestore + Storage | Web                 | [#989](https://github.com/capawesome-team/capacitor-firebase/pull/989) |
| DocumentReference deserializer stack overflow fixed | Firestore           | Web                 | [#981](https://github.com/capawesome-team/capacitor-firebase/pull/981) |
| New setDefaults(...) method                         | Remote Config       | Web + iOS + Android | [#970](https://github.com/capawesome-team/capacitor-firebase/pull/970) |
| New getAll() method                                 | Remote Config       | Web + iOS + Android | [#977](https://github.com/capawesome-team/capacitor-firebase/pull/977) |
| source exposed on Web                               | Remote Config       | Web                 | [#979](https://github.com/capawesome-team/capacitor-firebase/pull/979) |

## Cloud Firestore[¶](#cloud-firestore "Permanent link")

The bulk of this release lands in the [Cloud Firestore](/docs/plugins/firebase/cloud-firestore/) plugin.

### More Supported Data Types[¶](#more-supported-data-types "Permanent link")

Firestore documents can hold more than strings and numbers, but a few of those richer types never made it across the Capacitor bridge intact. The bridge serializes everything to JSON, and JSON has no concept of a document reference, a byte blob, or `NaN`. Version 8.3.0 adds proper round-trip support for all three on Web, iOS, and Android ([#991](https://github.com/capawesome-team/capacitor-firebase/pull/991)).

`DocumentReference` and `Bytes` each get a dedicated class, and the non-finite numbers `NaN`, `Infinity`, and `-Infinity` — which JSON would otherwise collapse to `null` — are wrapped so they survive the trip:

`[](#%5F%5Fcodelineno-0-1)import {
[](#%5F%5Fcodelineno-0-2)  Bytes,
[](#%5F%5Fcodelineno-0-3)  DocumentReference,
[](#%5F%5Fcodelineno-0-4)  FirebaseFirestore,
[](#%5F%5Fcodelineno-0-5)} from '@capacitor-firebase/firestore';
[](#%5F%5Fcodelineno-0-6)
[](#%5F%5Fcodelineno-0-7)await FirebaseFirestore.setDocument({
[](#%5F%5Fcodelineno-0-8)  reference: 'books/the-pragmatic-programmer',
[](#%5F%5Fcodelineno-0-9)  data: {
[](#%5F%5Fcodelineno-0-10)    cover: Bytes.fromUint8Array(coverBytes),
[](#%5F%5Fcodelineno-0-11)    author: DocumentReference.fromPath('authors/andrew-hunt'),
[](#%5F%5Fcodelineno-0-12)    rating: Infinity,
[](#%5F%5Fcodelineno-0-13)  },
[](#%5F%5Fcodelineno-0-14)});
`

When you read the document back, the values are deserialized for you: the `cover` field becomes a `Bytes` instance again, and `rating` comes back as the real `Infinity` number rather than `null`.

`[](#%5F%5Fcodelineno-1-1)const { snapshot } = await FirebaseFirestore.getDocument({
[](#%5F%5Fcodelineno-1-2)  reference: 'books/the-pragmatic-programmer',
[](#%5F%5Fcodelineno-1-3)});
[](#%5F%5Fcodelineno-1-4)const coverBytes = (snapshot.data?.cover as Bytes).toUint8Array();
`

Both classes mirror the Firebase JS SDK. Build a `Bytes` value with `fromBase64String(...)` or `fromUint8Array(...)` and read it with `toBase64()` or `toUint8Array()`, and point a `DocumentReference` at any document with `DocumentReference.fromPath(...)`.

### Queries in `getCountFromServer(...)`[¶](#queries-in-getcountfromserver "Permanent link")

`getCountFromServer(...)` lets you count documents without downloading them — handy for pagination headers or "X results" labels. Until now it could only count an entire collection, so any filtered count meant fetching the documents and counting them client-side.

8.3.0 adds the same `compositeFilter` and `queryConstraints` options that `getCollection(...)` already accepts ([#988](https://github.com/capawesome-team/capacitor-firebase/pull/988)), so you can count exactly the subset you care about:

`[](#%5F%5Fcodelineno-2-1)const { count } = await FirebaseFirestore.getCountFromServer({
[](#%5F%5Fcodelineno-2-2)  reference: 'users',
[](#%5F%5Fcodelineno-2-3)  compositeFilter: {
[](#%5F%5Fcodelineno-2-4)    type: 'and',
[](#%5F%5Fcodelineno-2-5)    queryConstraints: [
[](#%5F%5Fcodelineno-2-6)      {
[](#%5F%5Fcodelineno-2-7)        type: 'where',
[](#%5F%5Fcodelineno-2-8)        fieldPath: 'active',
[](#%5F%5Fcodelineno-2-9)        opStr: '==',
[](#%5F%5Fcodelineno-2-10)        value: true,
[](#%5F%5Fcodelineno-2-11)      },
[](#%5F%5Fcodelineno-2-12)    ],
[](#%5F%5Fcodelineno-2-13)  },
[](#%5F%5Fcodelineno-2-14)  queryConstraints: [{ type: 'limit', limit: 100 }],
[](#%5F%5Fcodelineno-2-15)});
`

Both options are optional, so calling `getCountFromServer(...)` with just a `reference` works exactly as before.

### A `serverTimestamps` Option for Snapshot Listeners[¶](#a-servertimestamps-option-for-snapshot-listeners "Permanent link")

When you write a field with `serverTimestamp()`, the value is filled in by the server. But a snapshot listener fires immediately with your local write, before the server acknowledges it — and in that pending state the timestamp field has no value yet. By default it comes back as `null`.

The new `serverTimestamps` option lets you choose what happens in that window. It's available on `addDocumentSnapshotListener(...)`, `addCollectionSnapshotListener(...)`, and `addCollectionGroupSnapshotListener(...)` ([#993](https://github.com/capawesome-team/capacitor-firebase/pull/993)):

`[](#%5F%5Fcodelineno-3-1)await FirebaseFirestore.addDocumentSnapshotListener(
[](#%5F%5Fcodelineno-3-2)  {
[](#%5F%5Fcodelineno-3-3)    reference: 'users/alice',
[](#%5F%5Fcodelineno-3-4)    serverTimestamps: 'estimate',
[](#%5F%5Fcodelineno-3-5)  },
[](#%5F%5Fcodelineno-3-6)  (event) => {
[](#%5F%5Fcodelineno-3-7)    console.log(event?.snapshot.data?.lastSeen);
[](#%5F%5Fcodelineno-3-8)  },
[](#%5F%5Fcodelineno-3-9));
`

The three values map directly to the Firebase SDK behavior: `'none'` (the default) returns `null` for pending timestamps, `'estimate'` substitutes the client's best guess at the server time, and `'previous'` returns the field's prior value.

### Bug Fixes[¶](#bug-fixes "Permanent link")

Three fixes round out the Firestore changes:

* **`limitToLast` now works on Android** ([#992](https://github.com/capawesome-team/capacitor-firebase/pull/992)). The Android query builder only recognized `limit`, so a `limitToLast` constraint was dropped and threw a `NullPointerException`. It now behaves like iOS.
* **Listeners created in the same millisecond no longer overwrite each other** ([#989](https://github.com/capawesome-team/capacitor-firebase/pull/989)). Web listener IDs were timestamp-based; they're now generated uniquely. This fix also applies to [Cloud Storage](/docs/plugins/firebase/cloud-storage/).
* **`DocumentReference` fields no longer crash the web deserializer** ([#981](https://github.com/capawesome-team/capacitor-firebase/pull/981)). A reference field used to trigger a `Maximum call stack size exceeded` error on the web.

## Remote Config[¶](#remote-config "Permanent link")

The [Remote Config](/docs/plugins/firebase/remote-config/) plugin gains two new methods and a web improvement.

### `setDefaults(...)`[¶](#setdefaults "Permanent link")

In-app default values let your app behave sensibly before the first successful fetch — or when the device is offline. 8.3.0 adds `setDefaults(...)` to register them ([#970](https://github.com/capawesome-team/capacitor-firebase/pull/970)):

`[](#%5F%5Fcodelineno-4-1)await FirebaseRemoteConfig.setDefaults({
[](#%5F%5Fcodelineno-4-2)  defaults: {
[](#%5F%5Fcodelineno-4-3)    welcome_message: 'Hello',
[](#%5F%5Fcodelineno-4-4)    feature_enabled: false,
[](#%5F%5Fcodelineno-4-5)    max_items: 10,
[](#%5F%5Fcodelineno-4-6)  },
[](#%5F%5Fcodelineno-4-7)});
`

Defaults accept strings, numbers, and booleans. Any key you haven't fetched from the server falls back to the value you set here.

### `getAll()`[¶](#getall "Permanent link")

Reading config values one key at a time gets tedious when you want to inspect everything at once — for a debug screen, say. The new `getAll()` method returns every key/value pair in a single call ([#977](https://github.com/capawesome-team/capacitor-firebase/pull/977)):

`` [](#%5F%5Fcodelineno-5-1)const { values } = await FirebaseRemoteConfig.getAll();
[](#%5F%5Fcodelineno-5-2)
[](#%5F%5Fcodelineno-5-3)for (const [key, { value, source }] of Object.entries(values)) {
[](#%5F%5Fcodelineno-5-4)  console.log(`${key} = ${value} (from ${source})`);
[](#%5F%5Fcodelineno-5-5)}
 ``

Each entry carries both the value as a string and its `source`, so you can tell whether a value came from the server, a default, or the static fallback.

### `source` Now Available on Web[¶](#source-now-available-on-web "Permanent link")

That `source` field — `Static`, `Default`, or `Remote` — used to be populated only on Android and iOS. It now works on the web too, across `getBoolean(...)`, `getNumber(...)`, `getString(...)`, and `getAll()` ([#979](https://github.com/capawesome-team/capacitor-firebase/pull/979)):

`[](#%5F%5Fcodelineno-6-1)const { value, source } = await FirebaseRemoteConfig.getString({
[](#%5F%5Fcodelineno-6-2)  key: 'welcome_message',
[](#%5F%5Fcodelineno-6-3)});
[](#%5F%5Fcodelineno-6-4)console.log(value, source); // "Hello" "Remote"
`

Because it's now guaranteed on every platform, `source` is no longer optional in the result types.

## Upgrading[¶](#upgrading "Permanent link")

Bump the Capacitor Firebase packages you use to 8.3.0 and sync your native projects:

`[](#%5F%5Fcodelineno-7-1)npm install @capacitor-firebase/firestore@^8.3.0 @capacitor-firebase/remote-config@^8.3.0
[](#%5F%5Fcodelineno-7-2)npx cap sync
`

There are no breaking changes in this release. If you're installing either plugin for the first time, the [Cloud Firestore](/docs/plugins/firebase/cloud-firestore/#installation) and [Remote Config](/docs/plugins/firebase/remote-config/#installation) installation guides walk through the platform setup.

[Subscribe to the Capawesome Newsletter](https://capawesome.io/newsletter)

## Final Thoughts[¶](#final-thoughts "Permanent link")

If you store references or binary data in Firestore, or you've been counting filtered queries by hand, 8.3.0 is worth the upgrade — those gaps were the kind that forced awkward workarounds. The Remote Config additions are smaller, but a consistent `source` across all three platforms makes config-driven logic easier to reason about.

To go further from here:

* [Announcing the Capacitor Firebase Cloud Firestore Plugin](/blog/announcing-the-capacitor-firebase-cloud-firestore-plugin/) — the original introduction to the Firestore plugin and what it can do.

Got a question or hit an edge case? Drop into the [Capawesome Discord server](https://discord.gg/VCXxSVjefW) — we're always happy to help. And to catch the next release write-up in your inbox, subscribe to the [Capawesome newsletter](https://capawesome.io/newsletter).

June 4, 2026 

 Back to top 