Skip to content

Releases: mozilla/application-services

v145.0

13 Oct 13:26
f881713

Choose a tag to compare

v145.0 (2025-10-13)

✨ What's New ✨

Swift

  • Added @unchecked Sendable to classes that conform to FeatureManifestInterface. (#6963)

Ads Client

  • Added the Ads Client component to the Megazord.
  • Updated the ApiError enum to AdsClientApiError to avoid naming collision.
  • The context_id is now generated and rotated via the existing eponym component crate.

Relay

  • ⚠️ Breaking Change: The error handling for the Relay component has been refactored for stronger forward compatibility and more transparent error reporting in Swift and Kotlin via UniFFI.
    • API and network errors from the Relay server are now converted to a single RelayApiError::Api { status, code, detail } variant, exposing the HTTP status code, a machine-readable error code (if present), and a human-readable detail message.
    • Downstream client apps can now handle server errors based on both the status and error_code fields directly, without additional changes to the Rust component - even as server-side error codes evolve.
    • Consumers must update their error handling code to match the new Api { status, code, detail } shape.

Places

  • places::storage::history_metadata::get_most_recent(limit: i32) was added to get most recent history metadata limited to a number. (#7002)

FxA Client

  • Expose getAttachedClients from the uniffi layer in the Android wrapper.

🦊 What's Changed 🦊

Docs

  • Updated the components strategy doc to better reflect the current state of application services. (#6991)

Full Changelog

v144.0

15 Sep 13:19
9580865

Choose a tag to compare

v144.0 (2025-09-15)

✨ What's New ✨

OHTTP Client

  • The as-ohttp-client component is being reintroduced to allow firefox-ios to
    optionally submit Glean pings over OHTTP.

🦊 What's Changed 🦊

Android

  • Bumped the minimum SDK version to 26 (Android 8). (#6926

Glean

  • Updated to v65.0.0 (#6901)

Full Changelog

v143.0

18 Aug 15:07

Choose a tag to compare

🦊 What's Changed 🦊

Android

  • Upgraded NDK from r28b to r28c. (#6848)

Logins

  • Updated logins verification telemetry so it can be used in iOS(#6832)
  • Updated insert statement to allow updating previously deleted logins via add_with_meta.

Webext-Storage

Search

  • Added SearchEngineUrl::is_new_until (bug 1979962)
  • Added SearchEngineUrl::exclude_partner_code_from_telemetry (bug 1980474)
  • Added SearchEngineUrl::accepted_content_types

RC Crypto

  • Fix NSS bindings for key management

Mozilla Ads Client

  • Created a new component, ads-client

Full Changelog

v142.0

21 Jul 16:51
b2fb41c

Choose a tag to compare

Logins

  • expose constructors for ManagedEncryptorDecryptor and NSSKeyManager
  • change PrimaryPasswordAuthenticator callbacks to be async (a breaking change, but not yet used by anyone)
  • return Result in PrimaryPasswordAuthenticator callbacks (again a breaking change, but not yet used by anyone)
  • add factory for login store with nss key manager: create_login_store_with_nss_keymanager to avoid round-tripping the KeyManager trait interface through JS.
  • add LoginStore shutdown() function to close database connection
  • extend LoginStore shutdown() to also remove the encdec

Nimbus SDK ⛅️🔬🔭

  • Updated the Nimbus API Stage URL
  • Updated the Nimbus SDK to support setting Gecko preferences (#6826).

Nimbus FML && CLI

  • handle http status codes when fetching feature manifests from GitHub.

Search

  • SearchEngineUrls now has an optional visual_search field, supporting
    visual search endpoints in engine configs.
  • SearchEngineUrl now has an optional display_name field, which is useful if
    a URL corresponds to a brand name distinct from the engine's brand name.

Full Changelog

v141.0

23 Jun 12:59
2e4b641

Choose a tag to compare

✨ What's New ✨

Filter Adult

  • Added the first version of a component for checking if base domains exist in a
    list of base domains for adult websites.

Logins

  • add checkpoint API: set_checkpoint(checkpoint) and get_checkpoint() for desktop's rolling migration
  • add delete_many(ids) for batch deletion within a single transaction
  • Add count(), count_by_origin() and count_by_form_action_origin() methods

Sync Manager

  • Added sync settings metrics for mobile. #6786

🦊 What's Changed 🦊

Context ID

  • The ContextIDComponent constructor no longer throws an error. This is not a breaking change since neither iOS or Android implement this yet.
  • The ContextIDComponent constructor can now synchronously invoke the rotation callback when it receives an invalid timestamp from callers; in such cases, it falls back to the current timestamp and forces an ID rotation.
  • rotate_context_id is no longer public since consumers can use force_rotation instead.

Glean

  • Updated to v64.4.0 (#6795)

Full Changelog

v140.0

23 May 18:59
8ee6cb6

Choose a tag to compare

⚠️ Breaking Changes ⚠️

Android

  • Added RustComponentsInitializer.kt to init_rust_components.

Context ID

  • Added the first version of a component for managing and rotating context IDs
    sent to MARS / Merino.

BREAKING CHANGE

  • Removed Megazord.kt and moved the contents to the new RustComponentsInitializer.kt.

🦊 What's Changed 🦊

Remote Settings

  • RemoteSettingsService::sync is now more efficient. It checks the remote settings changes
    endpoint and only syncs collections that have been modified since the last sync.

Logins

  • add logins store api methods for bulk insert and meta insert, intended to be used during migration and CSV import on desktop:
    • fn add_with_record(&self, entry_with_record: LoginEntryWithRecordFields): add a login together with metadata
    • fn add_many(&self, entries: Vec<LoginEntry>): add multiple logins with single transaction
    • fn add_many_with_records(&self, entries_with_records: Vec<LoginEntryWithRecordFields>): add multiple logins with metadata within single transaction

Glean

  • Updated to v64.3.1 (#6755/#6762)
  • Reverted the JNA dependency version back to 5.14.0 due Android 5/6 crashes. (#6762)

🔧 What's Fixed 🔧

Remote Settings

  • Fixed setting a new app context with RemoteSettingsService::update_config

Search

  • The SearchEngineSelector::filter_engine_configuration will now sort any
    unordered engines by name rather than identifier.

Full Changelog

v139.0

28 Apr 16:00

Choose a tag to compare

🦊 What's Changed 🦊

Android

  • Upgraded the JNA dependency version to 5.17.0. (#6649)
  • Updated to a newer version of Android Components (139.0.20250417022706).
  • Upgraded NDK from r28 to r28b. (#6723)

Glean

Logins

  • New NSSKeyManager, which provides an NSS-backed key manager implementation.
    Given a PrimaryPasswordAuthenticator implementation, the NSS keystore is used
    to store and retrieve the login encryption key. These features are only
    available when the Logins component is compiled with the keydb feature.
    (#6571)

Sync Pass Example

The sync-pass example has been adapted to use the NSSKeyManager. The example
program can be called with an FX profile path in which the key is stored in the
file key4.db and secured with a possibly set primary password.
(#6571)
And it has been polished up a bit: passwords are no longer displayed in plain
text, the list view has been slimmed down and a detail view has been added.
(#6685)

  • Added a function to locally remove corrupted logins. (#6667)

Remote Settings

  • The RemoteSettingsService constructor and RemoteSettingsService::make_client no longer perform any IO.
    This integrates better with JS, which expects all IO to happen inside async functions.
  • Added RemoteSettingsClient::close, which can be used to close the underlying SQLite DB during down.

⚠️ Breaking Changes ⚠️

Remote Settings

  • Several methods RemoteSettingsService are now infallible, which is a breaking change for Swift code.
    • RelevancyStore constructor
    • RemoteSettingsService constructor
    • RemoteSettingsService::make_client()
    • SearchEngineSelector::use_remote_settings_server()
    • SuggestStore constructor

OHTTP Client

  • The now-unused as-ohttp-client component is now removed. It was previously
    only used by firefox-ios but no longer is.

Full Changelog

v138.0

31 Mar 14:59
ed950ba

Choose a tag to compare

🦊 What's Changed 🦊

Android

  • Upgraded Kotlin compiler from 1.9.24 to 2.1.20 (#6640)/(#6654)

nss

  • Initialize nss explicitly (#6596)

BREAKING CHANGE:

Components need to call nss::ensure_initialized() before using any component
that depends on NSS. Applications can depend on the init_rust_components
component to handle initialization.

rc_crypto

  • ensure_initialized() now returns a Result

Full Changelog

v137.0

03 Mar 22:55
7222bb3

Choose a tag to compare

🦊 What's Changed 🦊

init_rust_components

  • new component to provide Rust initialization routines, initially aimed at initializing NSS

Android

  • Upgraded NDK from r27c to r28. (#6588)

Glean

  • Updated to v63.1.0 (#6584)

Nimbus SDK ⛅️🔬🔭

  • Enable enrollment status telemetry (#6606)

Full Changelog

v136.0

03 Feb 14:45
812e102

Choose a tag to compare

Logins

The Logins component has been rewritten to use a newly introduced EncryptorDecryptor trait.

BREAKING CHANGE

The LoginsStore constructor and several API methods have been changed:

The signatures of the constructors are extended as follows:

pub fn new(path: impl AsRef<Path>, encdec: Arc<dyn EncryptorDecryptor>) -> ApiResult<Self>
pub fn new_from_db(db: LoginDb, encdec: Arc<dyn EncryptorDecryptor>) -> Self
pub fn new_in_memory(encdec: Arc<dyn EncryptorDecryptor>) -> ApiResult<Self>

The methods do not require an encryption key argument anymore, and return Login objects instead of EncryptedLogin:

pub fn list(&self) -> ApiResult<Vec<Login>>
pub fn get(&self, id: &str) -> ApiResult<Option<Login>>
pub fn get_by_base_domain(&self, base_domain: &str) -> ApiResult<Vec<Login>>
pub fn find_login_to_update(&self, entry: LoginEntry) -> ApiResult<Option<Login>>
pub fn update(&self, id: &str, entry: LoginEntry) -> ApiResult<Login>
pub fn add(&self, entry: LoginEntry) -> ApiResult<Login>
pub fn add_or_update(&self, entry: LoginEntry) -> ApiResult<Login>

New LoginsStore methods:

// Checking whether the database contains logins (does not utilize the `EncryptorDecryptor`):
is_empty(&self) -> ApiResult<bool>
// Checking for the Existence of Logins for a given base domain (also does not utilize the `EncryptorDecryptor`):
has_logins_by_base_domain(&self, base_domain: &str) -> ApiResult<bool>

The crypto primitives encrypt, decrypt, encrypt_struct and decrypt_struct are not exposed anymore via UniFFI, as well as EncryptedLogin will not be exposed anymore. In addition we also do not expose the structs RecordFields, LoginFields and SecureLoginFields anymore.

SyncEngine

The logins sync engine has been adapted for above EncryptorDecryptor trait and therefore does not support a set_local_encryption_key method anymore.

Flattened Login Struct

The flattened Login struct now does not expose internal structuring to the consumer:

Login {
    // record fields
    string id;
    i64 times_used;
    i64 time_created;
    i64 time_last_used;
    i64 time_password_changed;

    // login fields
    string origin;
    string? http_realm;
    string? form_action_origin;
    string username_field;
    string password_field;

    // secure login fields
    string password;
    string username;
}

rc_crypto

  • New low level bindings for dealing with primary password.
  • New feature flag keydb in rc_crypto/nss, which enables NSS key persistence: ensure_initialized_with_profile_dir(path: impl AsRef<Path>) initializes NSS with a profile directory and appropriate flags to persist keys (and certificates) in its internal PKCS11 software implementation. This function must be called first; if ensure_initialized is called before, it will fail.
  • New methods for dealing with primary password and key persistence, available within the keydb feature:
    • authentication_with_primary_password_is_needed(): checks whether a primary password is set and needs to be authenticated
    • authenticate_with_primary_password(primary_password: &str): method for authenticate NSS key store against a user-provided primary password
    • get_or_create_aes256_key(name: &str): retrieve a key by name from the internal NSS key store. If none exists, create one, persist, and return.

Remote Settings

  • Added support of content signatures verification (#6534)

Full Changelog