---
description: The Capawesome December update is here! This update includes new features and improvements for Capawesome Cloud and our Plugins.
title: Capawesome December 2024 Update - Capawesome
image: https://capawesome.io/docs/assets/images/social/blog/2024-december-update.png
---

[ Skip to content](#capawesome-december-2024-update) 

[ 🎉 Introducing **Capawesome Platform** — one platform for Live Updates, Native Builds, App Store Publishing, and Insider SDKs.](https://capawesome.io) 

* [  Formbricks ](/docs/plugins/formbricks/)
* [  Geocoder ](/docs/plugins/geocoder/)
* [  Google Sign-In ](/docs/plugins/google-sign-in/)
* [  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/)
* [  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/)
* [  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

* [  Cloud ](#cloud)
* [  Plugins ](#plugins)
* [  Community ](#community)

# Capawesome December 2024 Update[¶](#capawesome-december-2024-update "Permanent link")

The Capawesome December update is here! This update includes new features and improvements for [Capawesome Cloud](/docs/cloud/) and our [Plugins](/docs/plugins/). There are also some news from the community. Let's take a look at the most important changes.

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

## CLI[¶](#cli "Permanent link")

### `login` command no longer creates tokens[¶](#login-command-no-longer-creates-tokens "Permanent link")

Until now, the `login` command created a new token every time you logged in using email and password. However, tokens were originally only intended for the API and CI/CD. To avoid confusion, the `login` command no longer creates tokens. Instead, a session is created, which is automatically deleted after 30 days of inactivity.

## Cloud[¶](#cloud "Permanent link")

### Unsubscribe from notifications[¶](#unsubscribe-from-notifications "Permanent link")

You can now unsubscribe from notifications via the [Capawesome Cloud Console](https://console.cloud.capawesome.io/settings/notifications). Simply navigate to the `Notifications` page and select the notifications you want to subscribe to or unsubscribe from.

### Manage sessions[¶](#manage-sessions "Permanent link")

You can now manage your sessions via the [Capawesome Cloud Console](https://console.cloud.capawesome.io/settings/sessions). Simply navigate to the `Sessions` page and view all your active sessions. You can also revoke sessions if needed.

## Plugins[¶](#plugins "Permanent link")

### Android Foreground Service[¶](#android-foreground-service "Permanent link")

The [Android Foreground Service](/docs/plugins/android-foreground-service/) plugin now has a new `serviceType` option that allows you to specify the type of the foreground service:

`[](#%5F%5Fcodelineno-0-1)import { ForegroundService, ServiceType } from '@capawesome-team/capacitor-android-foreground-service';
[](#%5F%5Fcodelineno-0-2)
[](#%5F%5Fcodelineno-0-3)const startForegroundService = async () => {
[](#%5F%5Fcodelineno-0-4)  await ForegroundService.startForegroundService({
[](#%5F%5Fcodelineno-0-5)    id: 1,
[](#%5F%5Fcodelineno-0-6)    title: 'Recording',
[](#%5F%5Fcodelineno-0-7)    body: 'Recording audio in the background',
[](#%5F%5Fcodelineno-0-8)    smallIcon: 'ic_stat_icon_config_sample',
[](#%5F%5Fcodelineno-0-9)    serviceType: ServiceType.Microphone
[](#%5F%5Fcodelineno-0-10)  });
[](#%5F%5Fcodelineno-0-11)};
`

For now, only two service types are supported. Feel free to open an issue if you are missing a specific service type.

### App Shortcuts[¶](#app-shortcuts "Permanent link")

We have published a new [App Shortcuts](/docs/plugins/app-shortcuts/) plugin that allows you to manage app shortcuts and quick actions on Android and iOS. The plugin can be installed via the public npm registry:

`[](#%5F%5Fcodelineno-1-1)npm install @capawesome/capacitor-app-shortcuts
`

Here is an example of how to use the plugin:

`[](#%5F%5Fcodelineno-2-1)import { AppShortcuts } from '@capawesome/capacitor-app-shortcuts';
[](#%5F%5Fcodelineno-2-2)
[](#%5F%5Fcodelineno-2-3)const set = async () => {
[](#%5F%5Fcodelineno-2-4)  await AppShortcuts.set({
[](#%5F%5Fcodelineno-2-5)    shortcuts: [
[](#%5F%5Fcodelineno-2-6)      {
[](#%5F%5Fcodelineno-2-7)        id: 'feedback',
[](#%5F%5Fcodelineno-2-8)        title: 'Feedback',
[](#%5F%5Fcodelineno-2-9)      }
[](#%5F%5Fcodelineno-2-10)    ],
[](#%5F%5Fcodelineno-2-11)  });
[](#%5F%5Fcodelineno-2-12)};
`

| Android | iOS |
| ------- | --- |

### Firebase Analytics[¶](#firebase-analytics "Permanent link")

The [Firebase Analytics](/docs/plugins/firebase/analytics/) plugin now supports the Firebase JS SDK 11.

### Firebase App[¶](#firebase-app "Permanent link")

The [Firebase App](/docs/plugins/firebase/app/) plugin now supports the Firebase JS SDK 11.

### Firebase App Check[¶](#firebase-app-check "Permanent link")

The [Firebase App Check](/docs/plugins/firebase/app-check/) plugin now supports the Firebase JS SDK 11.

### Firebase Authentication[¶](#firebase-authentication "Permanent link")

The [Firebase Authentication](/docs/plugins/firebase/authentication/) plugin received multiple updates this month.

##### Firebase JS SDK 11[¶](#firebase-js-sdk-11 "Permanent link")

The plugin now supports the Firebase JS SDK 11.

##### Facebook iOS SDK[¶](#facebook-ios-sdk "Permanent link")

The [Facebook iOS SDK](https://github.com/facebook/facebook-ios-sdk) was updated to version 17.1.0.

##### New `idTokenChange` listener[¶](#new-idtokenchange-listener "Permanent link")

The plugin now has a new `idTokenChange` listener that allows you to listen for changes to the ID token:

`[](#%5F%5Fcodelineno-3-1)import { FirebaseAuthentication } from '@capacitor-firebase/authentication';
[](#%5F%5Fcodelineno-3-2)
[](#%5F%5Fcodelineno-3-3)const addListener = async () => {
[](#%5F%5Fcodelineno-3-4)  FirebaseAuthentication.addListener('idTokenChange', async (event) => {
[](#%5F%5Fcodelineno-3-5)    console.log(event);
[](#%5F%5Fcodelineno-3-6)  });
[](#%5F%5Fcodelineno-3-7)};
`

##### New `verifyBeforeUpdateEmail` method[¶](#new-verifybeforeupdateemail-method "Permanent link")

The plugin now has a new `verifyBeforeUpdateEmail` method that allows you to verify the email before updating it:

`[](#%5F%5Fcodelineno-4-1)import { FirebaseAuthentication } from '@capacitor-firebase/authentication';
[](#%5F%5Fcodelineno-4-2)
[](#%5F%5Fcodelineno-4-3)const verifyBeforeUpdateEmail = async () => {
[](#%5F%5Fcodelineno-4-4)  await FirebaseAuthentication.verifyBeforeUpdateEmail({
[](#%5F%5Fcodelineno-4-5)    newEmail: 'mail@example.com',
[](#%5F%5Fcodelineno-4-6)    actionCodeSettings: {
[](#%5F%5Fcodelineno-4-7)      url: 'https://www.example.com/cart?email=user@example.com&cartId=123',
[](#%5F%5Fcodelineno-4-8)      iOS: {
[](#%5F%5Fcodelineno-4-9)        bundleId: 'com.example.ios'
[](#%5F%5Fcodelineno-4-10)      },
[](#%5F%5Fcodelineno-4-11)      android: {
[](#%5F%5Fcodelineno-4-12)        packageName: 'com.example.android',
[](#%5F%5Fcodelineno-4-13)        installApp: true,
[](#%5F%5Fcodelineno-4-14)        minimumVersion: '12'
[](#%5F%5Fcodelineno-4-15)      },
[](#%5F%5Fcodelineno-4-16)      handleCodeInApp: true
[](#%5F%5Fcodelineno-4-17)    }
[](#%5F%5Fcodelineno-4-18)  });
[](#%5F%5Fcodelineno-4-19)};
`

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

The [Firebase Cloud Firestore](/docs/plugins/firebase/cloud-firestore/) plugin now supports the Firebase JS SDK 11.

### Firebase Cloud Functions[¶](#firebase-cloud-functions "Permanent link")

The [Firebase Cloud Functions](/docs/plugins/firebase/cloud-functions/) plugin received multiple updates this month.

##### Firebase JS SDK 11[¶](#firebase-js-sdk-11%5F1 "Permanent link")

The plugin now supports the Firebase JS SDK 11.

##### New `regionOrCustomDomain` option[¶](#new-regionorcustomdomain-option "Permanent link")

The `UseEmulatorOptions` interface now has a new `regionOrCustomDomain` option that allows you to specify the region or custom domain for the emulator:

`[](#%5F%5Fcodelineno-5-1)import { FirebaseFunctions } from '@capacitor-firebase/functions';
[](#%5F%5Fcodelineno-5-2)
[](#%5F%5Fcodelineno-5-3)const useEmulator = async () => {
[](#%5F%5Fcodelineno-5-4)  await FirebaseFunctions.useEmulator({
[](#%5F%5Fcodelineno-5-5)    host: '10.0.2.2',
[](#%5F%5Fcodelineno-5-6)    port: 9001,
[](#%5F%5Fcodelineno-5-7)    regionOrCustomDomain: 'us-central1'
[](#%5F%5Fcodelineno-5-8)  });
[](#%5F%5Fcodelineno-5-9)};
`

### Firebase Cloud Messaging[¶](#firebase-cloud-messaging "Permanent link")

The [Firebase Cloud Messaging](/docs/plugins/firebase/cloud-messaging/) plugin now supports the Firebase JS SDK 11.

### Firebase Cloud Storage[¶](#firebase-cloud-storage "Permanent link")

The [Firebase Cloud Storage](/docs/plugins/firebase/cloud-storage/) plugin now supports the Firebase JS SDK 11.

### Firebase Performance Monitoring[¶](#firebase-performance-monitoring "Permanent link")

The [Firebase Performance Monitoring](/docs/plugins/firebase/performance-monitoring/) plugin received multiple updates this month.

##### Firebase JS SDK 11[¶](#firebase-js-sdk-11%5F2 "Permanent link")

The plugin plugin now supports the Firebase JS SDK 11.

##### New methods[¶](#new-methods "Permanent link")

The plugin got a few new methods that allow you to put and get attributes and metrics for a trace:

`[](#%5F%5Fcodelineno-6-1)import { FirebasePerformance } from '@capacitor-firebase/performance';
[](#%5F%5Fcodelineno-6-2)
[](#%5F%5Fcodelineno-6-3)const putAttribute = async () => {
[](#%5F%5Fcodelineno-6-4)  await FirebasePerformance.putAttribute({
[](#%5F%5Fcodelineno-6-5)    traceName: 'test_trace',
[](#%5F%5Fcodelineno-6-6)    attribute: 'user_id',
[](#%5F%5Fcodelineno-6-7)    value: '123',
[](#%5F%5Fcodelineno-6-8)  });
[](#%5F%5Fcodelineno-6-9)};
[](#%5F%5Fcodelineno-6-10)
[](#%5F%5Fcodelineno-6-11)const getAttribute = async () => {
[](#%5F%5Fcodelineno-6-12)  const result = await FirebasePerformance.getAttribute({
[](#%5F%5Fcodelineno-6-13)    traceName: 'test_trace',
[](#%5F%5Fcodelineno-6-14)    attribute: 'user_id',
[](#%5F%5Fcodelineno-6-15)  });
[](#%5F%5Fcodelineno-6-16)  return result.attributes;
[](#%5F%5Fcodelineno-6-17)};
[](#%5F%5Fcodelineno-6-18)
[](#%5F%5Fcodelineno-6-19)const getAttributes = async () => {
[](#%5F%5Fcodelineno-6-20)  const result = await FirebasePerformance.getAttributes({ traceName: 'test_trace' });
[](#%5F%5Fcodelineno-6-21)  return result.attributes;
[](#%5F%5Fcodelineno-6-22)};
[](#%5F%5Fcodelineno-6-23)
[](#%5F%5Fcodelineno-6-24)const removeAttribute = async () => {
[](#%5F%5Fcodelineno-6-25)  await FirebasePerformance.removeAttribute({
[](#%5F%5Fcodelineno-6-26)    traceName: 'test_trace',
[](#%5F%5Fcodelineno-6-27)    attribute: 'user_id',
[](#%5F%5Fcodelineno-6-28)  });
[](#%5F%5Fcodelineno-6-29)};
[](#%5F%5Fcodelineno-6-30)
[](#%5F%5Fcodelineno-6-31)const putMetric = async () => {
[](#%5F%5Fcodelineno-6-32)  await FirebasePerformance.putMetric({
[](#%5F%5Fcodelineno-6-33)    traceName: 'test_trace',
[](#%5F%5Fcodelineno-6-34)    metricName: 'item_cache_hit',
[](#%5F%5Fcodelineno-6-35)    num: 1,
[](#%5F%5Fcodelineno-6-36)  });
[](#%5F%5Fcodelineno-6-37)};
[](#%5F%5Fcodelineno-6-38)
[](#%5F%5Fcodelineno-6-39)const getMetric = async () => {
[](#%5F%5Fcodelineno-6-40)  const result = await FirebasePerformance.getMetric({
[](#%5F%5Fcodelineno-6-41)    traceName: 'test_trace',
[](#%5F%5Fcodelineno-6-42)    metricName: 'item_cache_hit',
[](#%5F%5Fcodelineno-6-43)  });
[](#%5F%5Fcodelineno-6-44)  return result.value;
[](#%5F%5Fcodelineno-6-45)};
[](#%5F%5Fcodelineno-6-46)
[](#%5F%5Fcodelineno-6-47)const record = async () => {
[](#%5F%5Fcodelineno-6-48)  await FirebasePerformance.record({
[](#%5F%5Fcodelineno-6-49)    traceName: 'test_trace',
[](#%5F%5Fcodelineno-6-50)    startTime: Date.now(),
[](#%5F%5Fcodelineno-6-51)    duration: 1000,
[](#%5F%5Fcodelineno-6-52)    options: {
[](#%5F%5Fcodelineno-6-53)      metrics: {
[](#%5F%5Fcodelineno-6-54)        item_cache_hit: 1,
[](#%5F%5Fcodelineno-6-55)      },
[](#%5F%5Fcodelineno-6-56)      attributes: {
[](#%5F%5Fcodelineno-6-57)        user_id: '123',
[](#%5F%5Fcodelineno-6-58)      },
[](#%5F%5Fcodelineno-6-59)    },
[](#%5F%5Fcodelineno-6-60)  });
[](#%5F%5Fcodelineno-6-61)};
`

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

The [Firebase Remote Config](/docs/plugins/firebase/remote-config/) plugin now supports the Firebase JS SDK 11.

### Live Update[¶](#live-update "Permanent link")

The [Live Update](/docs/plugins/live-update/) plugin received multiple updates this month.

##### New `getCurrentBundle()` and `getNextBundle()` methods[¶](#new-getcurrentbundle-and-getnextbundle-methods "Permanent link")

The plugin now has new [getCurrentBundle()](/docs/plugins/live-update/#getcurrentbundle) and [getNextBundle()](/docs/plugins/live-update/#getnextbundle) methods that allow you to get the current and next bundle:

`` [](#%5F%5Fcodelineno-7-1)import { LiveUpdate } from '@capawesome/capacitor-live-update';
[](#%5F%5Fcodelineno-7-2)
[](#%5F%5Fcodelineno-7-3)/**
[](#%5F%5Fcodelineno-7-4) * Get the bundle identifier of the current bundle. 
[](#%5F%5Fcodelineno-7-5) * The current bundle is the bundle that is currently used by the app.
[](#%5F%5Fcodelineno-7-6) */
[](#%5F%5Fcodelineno-7-7)const getCurrentBundle = async () => {
[](#%5F%5Fcodelineno-7-8)  const { bundleId } = await LiveUpdate.getCurrentBundle();
[](#%5F%5Fcodelineno-7-9)  return bundleId;
[](#%5F%5Fcodelineno-7-10)};
[](#%5F%5Fcodelineno-7-11)
[](#%5F%5Fcodelineno-7-12)/**
[](#%5F%5Fcodelineno-7-13) * Get the bundle identifier of the next bundle. 
[](#%5F%5Fcodelineno-7-14) * The next bundle is the bundle that will be used after calling `reload()` or restarting the app.
[](#%5F%5Fcodelineno-7-15) */
[](#%5F%5Fcodelineno-7-16)const getNextBundle = async () => {
[](#%5F%5Fcodelineno-7-17)  const { bundleId } = await LiveUpdate.getNextBundle();
[](#%5F%5Fcodelineno-7-18)  return bundleId;
[](#%5F%5Fcodelineno-7-19)};
 ``

This change deprecated the [getBundle()](/docs/plugins/live-update/#getbundle) method.

##### New `setNextBundle(...)` method[¶](#new-setnextbundle-method "Permanent link")

The plugin now has a new [setNextBundle(...)](/docs/plugins/live-update/#setnextbundle) method that allows you to set the next bundle:

`` [](#%5F%5Fcodelineno-8-1)import { LiveUpdate } from '@capawesome/capacitor-live-update';
[](#%5F%5Fcodelineno-8-2)
[](#%5F%5Fcodelineno-8-3)/**
[](#%5F%5Fcodelineno-8-4) * Set the next bundle. 
[](#%5F%5Fcodelineno-8-5) * The next bundle is the bundle that will be used after calling `reload()` or restarting the app.
[](#%5F%5Fcodelineno-8-6) */
[](#%5F%5Fcodelineno-8-7)const setNextBundle = async () => {
[](#%5F%5Fcodelineno-8-8)  await LiveUpdate.setNextBundle({
[](#%5F%5Fcodelineno-8-9)    bundleId: '4b678425-fe57-485d-a8ff-a08af915bd29',
[](#%5F%5Fcodelineno-8-10)  });
[](#%5F%5Fcodelineno-8-11)};
 ``

This change deprecated the [setBundle(...)](/docs/plugins/live-update/#setbundle) method.

##### New `channel` property[¶](#new-channel-property "Permanent link")

The [fetchLatestBundle(...)](/docs/plugins/live-update/#fetchlatestbundle) and [sync(...)](/docs/plugins/live-update/#sync) methods now have a new `channel` property that allows you to specify the name of the channel where the latest bundle is fetched from:

`[](#%5F%5Fcodelineno-9-1)import { LiveUpdate } from '@capawesome/capacitor-live-update';
[](#%5F%5Fcodelineno-9-2)
[](#%5F%5Fcodelineno-9-3)/**
[](#%5F%5Fcodelineno-9-4) * Fetch the latest bundle from the specified channel.
[](#%5F%5Fcodelineno-9-5) */
[](#%5F%5Fcodelineno-9-6)const fetchLatestBundle = async () => {
[](#%5F%5Fcodelineno-9-7)  const result = await LiveUpdate.fetchLatestBundle({
[](#%5F%5Fcodelineno-9-8)    channel: 'production-5',
[](#%5F%5Fcodelineno-9-9)  });
[](#%5F%5Fcodelineno-9-10)  return result;
[](#%5F%5Fcodelineno-9-11)};
[](#%5F%5Fcodelineno-9-12)
[](#%5F%5Fcodelineno-9-13)/**
[](#%5F%5Fcodelineno-9-14) * Sync the latest bundle from the specified channel.
[](#%5F%5Fcodelineno-9-15) */
[](#%5F%5Fcodelineno-9-16)const sync = async () => {
[](#%5F%5Fcodelineno-9-17)  const result = await LiveUpdate.sync({
[](#%5F%5Fcodelineno-9-18)    channel: 'production-5',
[](#%5F%5Fcodelineno-9-19)  });
[](#%5F%5Fcodelineno-9-20)  return result;
[](#%5F%5Fcodelineno-9-21)};
`

##### New `FetchLatestBundleResult` properties[¶](#new-fetchlatestbundleresult-properties "Permanent link")

The [fetchLatestBundle(...)](/docs/plugins/live-update/#fetchlatestbundle) method now returns a `artifactType` and `downloadUrl` property:

`[](#%5F%5Fcodelineno-10-1)import { LiveUpdate } from '@capawesome/capacitor-live-update';
[](#%5F%5Fcodelineno-10-2)
[](#%5F%5Fcodelineno-10-3)const fetchLatestBundle = async () => {
[](#%5F%5Fcodelineno-10-4)  const result = await LiveUpdate.fetchLatestBundle();
[](#%5F%5Fcodelineno-10-5)  return {
[](#%5F%5Fcodelineno-10-6)    artifactType: result.artifactType,
[](#%5F%5Fcodelineno-10-7)    bundleId: result.bundleId,
[](#%5F%5Fcodelineno-10-8)    downloadUrl: result.downloadUrl,
[](#%5F%5Fcodelineno-10-9)  };
[](#%5F%5Fcodelineno-10-10)};
`

### NFC[¶](#nfc "Permanent link")

The [NFC](/docs/plugins/nfc/) plugin received multiple updates this month.

##### New `manufacturerCode` property[¶](#new-manufacturercode-property "Permanent link")

The plugin is now also able to read the IC Manufacturer Code for ISO15693 tags:

`[](#%5F%5Fcodelineno-11-1)import { Nfc, NfcTagTechType } from '@capawesome-team/capacitor-nfc';
[](#%5F%5Fcodelineno-11-2)
[](#%5F%5Fcodelineno-11-3)const readManufacturerCode = async () => {
[](#%5F%5Fcodelineno-11-4)  return new Promise((resolve) => {
[](#%5F%5Fcodelineno-11-5)    Nfc.addListener('nfcTagScanned', async (event) => {
[](#%5F%5Fcodelineno-11-6)      // Stop the NFC scan session
[](#%5F%5Fcodelineno-11-7)      await Nfc.stopScanSession();
[](#%5F%5Fcodelineno-11-8)      // Return the IC Manufacturer Code
[](#%5F%5Fcodelineno-11-9)      resolve(event.nfcTag.manufacturerCode);
[](#%5F%5Fcodelineno-11-10)    });
[](#%5F%5Fcodelineno-11-11)    // Start the NFC scan session
[](#%5F%5Fcodelineno-11-12)    void Nfc.startScanSession();
[](#%5F%5Fcodelineno-11-13)  });
[](#%5F%5Fcodelineno-11-14)};
`

##### HCE support[¶](#hce-support "Permanent link")

The plugin now supports [Host Card Emulation (HCE)](https://developer.android.com/develop/connectivity/nfc/hce) on Android. This allows you to emulate an NFC tag on your device and respond to commands from an NFC reader. Here is an example of how to use this feature:

`[](#%5F%5Fcodelineno-12-1)import { Nfc } from '@capawesome-team/capacitor-nfc';
[](#%5F%5Fcodelineno-12-2)
[](#%5F%5Fcodelineno-12-3)const addListener = async () => {
[](#%5F%5Fcodelineno-12-4)  Nfc.addListener('commandReceived', async (event) => {
[](#%5F%5Fcodelineno-12-5)    // Do something with the received command
[](#%5F%5Fcodelineno-12-6)    console.log(event.data);
[](#%5F%5Fcodelineno-12-7)    // Respond to the command
[](#%5F%5Fcodelineno-12-8)      await respond({ data: [...] });
[](#%5F%5Fcodelineno-12-9)  });
[](#%5F%5Fcodelineno-12-10)};
`

##### 0x24 command support[¶](#0x24-command-support "Permanent link")

The plugin now supports the Write Multiple Blocks command (0x24 command code), as defined in the ISO 15693-3 specification, also on iOS:

`[](#%5F%5Fcodelineno-13-1)import { Nfc, NfcTagTechType } from '@capawesome-team/capacitor-nfc';
[](#%5F%5Fcodelineno-13-2)
[](#%5F%5Fcodelineno-13-3)const writeMultipleBlocks = async () => {
[](#%5F%5Fcodelineno-13-4)  return new Promise((resolve) => {
[](#%5F%5Fcodelineno-13-5)    Nfc.addListener('nfcTagScanned', async (event) => {
[](#%5F%5Fcodelineno-13-6)      // Write multiple blocks to the NFC tag
[](#%5F%5Fcodelineno-13-7)      await Nfc.transceive({ 
[](#%5F%5Fcodelineno-13-8)        techType: NfcTagTechType.NfcV, 
[](#%5F%5Fcodelineno-13-9)        data: [...], 
[](#%5F%5Fcodelineno-13-10)        iso15693RequestFlags: [...], 
[](#%5F%5Fcodelineno-13-11)        iso15693CommandCode: 0x24 
[](#%5F%5Fcodelineno-13-12)      });
[](#%5F%5Fcodelineno-13-13)      // Stop the NFC scan session
[](#%5F%5Fcodelineno-13-14)      await Nfc.stopScanSession();
[](#%5F%5Fcodelineno-13-15)      resolve();
[](#%5F%5Fcodelineno-13-16)    });
[](#%5F%5Fcodelineno-13-17)    // Start the NFC scan session
[](#%5F%5Fcodelineno-13-18)    void Nfc.startScanSession();
[](#%5F%5Fcodelineno-13-19)  });
[](#%5F%5Fcodelineno-13-20)};
`

### Printer[¶](#printer "Permanent link")

The [Printer](/docs/plugins/printer/) plugin now also supports the web, at least with the `printWebView` method:

`[](#%5F%5Fcodelineno-14-1)import { Printer } from '@capawesome-team/capacitor-printer';
[](#%5F%5Fcodelineno-14-2)
[](#%5F%5Fcodelineno-14-3)const print = async () => {
[](#%5F%5Fcodelineno-14-4)  await Printer.printWebView({
[](#%5F%5Fcodelineno-14-5)    content: '<h1>Hello, World!</h1>',
[](#%5F%5Fcodelineno-14-6)  });
[](#%5F%5Fcodelineno-14-7)};
`

You can also use a print style sheet to customize the print output:

`[](#%5F%5Fcodelineno-15-1)@media print {
[](#%5F%5Fcodelineno-15-2)  h1 {
[](#%5F%5Fcodelineno-15-3)    color: red;
[](#%5F%5Fcodelineno-15-4)  }
[](#%5F%5Fcodelineno-15-5)}
`

For more information, check out the [mdn web docs](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS%5Fmedia%5Fqueries/Printing).

### Speech Recognition[¶](#speech-recognition "Permanent link")

We have published a new [Speech Recognition](/docs/plugins/speech-recognition/) plugin that allows you to transcribe speech to text. The plugin supports Android, iOS, and the web. It comes with a simple API that allows you to start and stop the recognition process:

`[](#%5F%5Fcodelineno-16-1)import { SpeechRecognition } from '@capawesome-team/capacitor-speech-recognition';
[](#%5F%5Fcodelineno-16-2)
[](#%5F%5Fcodelineno-16-3)const startListening = async () => {
[](#%5F%5Fcodelineno-16-4)  // Print the recognized text to the console
[](#%5F%5Fcodelineno-16-5)  await SpeechRecognition.addListener('result', (event) => {
[](#%5F%5Fcodelineno-16-6)    console.log('Result:', event.result);
[](#%5F%5Fcodelineno-16-7)  });
[](#%5F%5Fcodelineno-16-8)  // Start listening for speech
[](#%5F%5Fcodelineno-16-9)  await SpeechRecognition.startListening({
[](#%5F%5Fcodelineno-16-10)    language: 'en-US',
[](#%5F%5Fcodelineno-16-11)    silenceThreshold: 2000,
[](#%5F%5Fcodelineno-16-12)  });
[](#%5F%5Fcodelineno-16-13)};
`

Besides that, there are a few special features like the ability to set a silence threshold. The plugin is now available to all [Capawesome Insiders](/docs/insiders/).

### Speech Synthesis[¶](#speech-synthesis "Permanent link")

We have also published a new [Speech Synthesis](/docs/plugins/speech-synthesis/) plugin that allows you to convert text to speech. The plugin supports Android, iOS, and the web. You can customize the voice, pitch, and rate of the speech. Here is an example of how to use the plugin:

`[](#%5F%5Fcodelineno-17-1)import { SpeechSynthesis, QueueStrategy } from '@capawesome-team/capacitor-speech-synthesis';
[](#%5F%5Fcodelineno-17-2)
[](#%5F%5Fcodelineno-17-3)const speak = async () => {
[](#%5F%5Fcodelineno-17-4)  // Print every spoken word to the console
[](#%5F%5Fcodelineno-17-5)  await SpeechSynthesis.addListener('boundary', (event) => {
[](#%5F%5Fcodelineno-17-6)    console.log('boundary', event);
[](#%5F%5Fcodelineno-17-7)  });
[](#%5F%5Fcodelineno-17-8)  // Speak the text
[](#%5F%5Fcodelineno-17-9)  await SpeechSynthesis.speak({
[](#%5F%5Fcodelineno-17-10)    language: 'en-US',
[](#%5F%5Fcodelineno-17-11)    pitch: 1.0,
[](#%5F%5Fcodelineno-17-12)    queueStrategy: QueueStrategy.Add,
[](#%5F%5Fcodelineno-17-13)    rate: 1.0,
[](#%5F%5Fcodelineno-17-14)    text: 'Hello, World!',
[](#%5F%5Fcodelineno-17-15)    voiceId: 'com.apple.ttsbundle.Samantha-compact',
[](#%5F%5Fcodelineno-17-16)    volume: 1.0,
[](#%5F%5Fcodelineno-17-17)  });
[](#%5F%5Fcodelineno-17-18)};
`

The plugin is now available to all [Capawesome Insiders](/docs/insiders/).

### Torch[¶](#torch "Permanent link")

The [Torch](/docs/plugins/torch/) plugin now also supports the web using the [Media Capture and Streams API](https://developer.mozilla.org/en-US/docs/Web/API/Media%5FCapture%5Fand%5FStreams%5FAPI):

`[](#%5F%5Fcodelineno-18-1)import { Torch } from '@capawesome/capacitor-torch';
[](#%5F%5Fcodelineno-18-2)
[](#%5F%5Fcodelineno-18-3)const enable = async () => {
[](#%5F%5Fcodelineno-18-4)  await Torch.enable();
[](#%5F%5Fcodelineno-18-5)};
`

### Wifi[¶](#wifi "Permanent link")

The [Wifi](/docs/plugins/wifi/) plugin got a new configuration option that allows you to force the usage of the deprecated `WifiManager` API on Android as there have been several reports that the new `WifiNetworkSpecifier` API is not yet working as expected on some devices.

You can enable the `useWifiManager` option in the Capacitor configuration file:

`[](#%5F%5Fcodelineno-19-1){
[](#%5F%5Fcodelineno-19-2)  "plugins": {
[](#%5F%5Fcodelineno-19-3)    "Wifi": {
[](#%5F%5Fcodelineno-19-4)      "useWifiManager": true
[](#%5F%5Fcodelineno-19-5)    }
[](#%5F%5Fcodelineno-19-6)  }
[](#%5F%5Fcodelineno-19-7)}
`

## Community[¶](#community "Permanent link")

### Build a mobile app with Qwik and Capacitor[¶](#build-a-mobile-app-with-qwik-and-capacitor "Permanent link")

[@srapport](https://github.com/srapport) published the official [Qwik for iOS and Android](https://qwik.dev/docs/guides/capacitor/) guide this month. The guide explains how to create a mobile app for Android and iOS with Qwik using Capacitor and highlights what you need to pay attention to. This also includes a short introduction to the Capacitor Live Update plugin from Capawesome. Check out the guide [here](https://qwik.dev/docs/guides/capacitor/).

May 7, 2026 

 Back to top 