Skip to content
CAI
Software that uses CAICheck a score

BlueBubblesApp/bluebubbles-app

58.1

Weak · 19 September 2026

133.2k

lines of production code

Dart

primary language

1

measurement over time

CAI band scale
CAI lens gauges

What this system is

BlueBubbles is a cross-platform iMessage client that bridges mobile devices to a server, enabling users to send and receive messages, media, and reactions on desktop and web environments. The system manages complex background synchronization, push notification routing, and local data persistence while providing a highly customizable interface with platform-native skins and granular chat management features.

How it got here

2020–2022 — Cross-platform expansion and architectural modernization

104 changes.

The project underwent a major architectural overhaul, migrating to the GetX state management framework and restructuring the codebase into distinct service layers. This period focused on extending the application to full desktop support for Windows, macOS, and Linux, while simultaneously modernizing the Android and iOS build infrastructure. Significant effort was also dedicated to refining the user interface with platform-native skins, Material You theming, and enhanced iMessage-specific features like send effects and Find My integration.

2023–2026 — Android rewrite and UI modernization

70 changes.

This period focused on a comprehensive rewrite of the Android messaging layer to support UnifiedPush, improve background stability, and raise the minimum SDK version. Simultaneously, the application introduced a new Material 3 Expressive design system, granular chat theming with animated wallpapers, and a robust background isolate architecture to offload heavy database and network operations.

Features

Add BlueBubbles desktop integration for Linux Snap

Users on Linux can now launch BlueBubbles directly from their desktop environment via a newly added .desktop file. This file defines the application name, icon, and categories (Network, InstantMessaging, Chat), enabling proper integration with system menus and application launchers.

snap/gui · high confidence

Add PWA support for the web application

The web application now supports Progressive Web App (PWA) capabilities. This is enabled by adding the \web/index.html\ entry point, which configures the Flutter engine and splash screen, and the \web/manifest.json\ file, which defines the app's metadata, icons, and standalone display mode for installation on mobile and desktop devices.

web · high confidence

Add chat peek view for previewing conversations

Users can now long-press a conversation in the list to open a preview overlay (peek view) that displays a compact list of recent messages without navigating away from the main screen. This new dialog provides a quick way to review chat content, with support for dark mode theming and smooth fade-in animations, while allowing users to tap through to the full conversation view or dismiss the preview.

_lib/app/layouts/conversation\list/dialogs · high confidence

Add macOS desktop application support

Users can now run the BlueBubbles application on macOS. This change introduces the native macOS Runner target, including the application entry point, main window configuration with custom frame support, standard macOS menu bar, app icon assets, and necessary build configurations and entitlements for sandboxing and debugging.

macos/Runner · high confidence

Add metadata dialog for media attachments

Users can now view detailed metadata for media attachments via a new dialog. This feature displays key information such as filename and MIME type, along with any additional metadata fields available for the attachment, presented in a scrollable list within a styled dialog box.

_lib/app/layouts/fullscreen\media/dialogs · high confidence

Added custom mention dialog for editing mention display names

Users can now edit the display name of a mention after it has been inserted into a message. A new 'Custom Mention' dialog allows users to modify the text associated with a @mention, with the ability to cancel or confirm the change, ensuring that mentions reflect the desired label even if the original handle lookup differs.

_lib/app/layouts/conversation\view/dialogs · high confidence

Added handle selector view for choosing chat addresses

Introduced a new HandleSelectorView widget that allows users to search and select a specific handle (address) for a chat. The view loads all available handles, sorts them alphabetically while prioritizing those with associated contacts, and filters the list based on an existing chat's participants if applicable. It features a debounced search field that matches against both display names and addresses, and displays handle information (or fake names in redacted mode) within a list item that triggers a selection callback upon tap.

_lib/app/layouts/handle\_selector\view · high confidence

Added macOS platform support

The application now supports macOS, allowing users to run the app on Apple desktop operating systems. This change introduces the necessary Xcode project configuration, workspace setup, and build schemes required to compile and launch the Flutter-based application on macOS.

macos/Runner.xcodeproj, macos/Runner.xcworkspace · high confidence

Added typed helper classes for chat service types and language codes

This change introduces new utility classes in the helpers/types/classes directory to support chat and language functionality. The \ChatServiceType\ enum defines messaging service types (iMessage, SMS, RCS) with logic to parse service types from chat GUIDs and control UI visibility. The \language\_codes.dart\ file provides a comprehensive mapping of ISO 639-1 language codes to their display names, supporting various regional variants for languages like German, English, Spanish, French, and others, which will be used by ML Kit language identification and Smart Reply features.

lib/helpers/types/classes · high confidence

Added web-compatible ContactV2 model stub

A new ContactV2 model class has been introduced in the HTML-specific models directory to provide minimal web compatibility. This stub implements core contact properties (ID, display name, native ID, avatar path, addresses) and includes helper methods for normalizing phone numbers and emails, generating initials, and comparing contacts. It serves as a functional placeholder for web environments where full native contact access is unavailable, ensuring the application can still process and display contact data without crashing.

lib/models/html · high confidence

Android foreground service now supports custom headers and validates server URLs

The Android foreground service implementation has been updated to allow users to configure custom HTTP headers for server connections, which are now read from preferences and applied to the Socket.IO client. Additionally, the service now validates the stored server URL before attempting to connect, preventing crashes caused by malformed URLs (such as those with bare percent characters) and providing clearer notification feedback when configuration is missing or invalid.

android/app/src/main/kotlin/com/bluebubbles/messaging/services/foreground · high confidence

Android project configuration and documentation added

The Android module now includes essential Eclipse Buildship project files (.project and .settings/org.eclipse.buildship.core.prefs) to support IDE integration, alongside a new CLAUDE.md documentation file that outlines the Kotlin source structure, key service modules (such as foreground services, Firebase, and notifications), and the Dart-to-Android bridge implementation. The configuration specifies a Java home path and Gradle wrapper distribution, establishing the baseline build environment for the native Android component.

android · high confidence

Custom chat background image support with cropping and blurring

Users can now set a custom background image for individual chats. The new background editor allows selecting an image from the device, cropping it to the screen aspect ratio (with an option to lock or unlock the ratio), and applying a blur effect. The system automatically downscales large images to a maximum dimension of 2560 pixels and saves the result as a high-quality JPEG to optimize file size while maintaining visual fidelity.

lib/app/layouts/settings/pages/theming/background · high confidence

Enhanced search with sender and date filters

The global search interface now supports filtering results by sender (messages from you, not from you, or by specific handle) and by date range (since a specific date). These filters are applied to both local device searches and network-based searches, allowing users to narrow down results more precisely. The search view includes UI controls for selecting these filters, and the underlying query logic has been updated to respect these constraints in both the local ObjectBox database and the remote API.

_lib/app/layouts/conversation\list/pages/search · high confidence

Initial Flatpak packaging for Linux

BlueBubbles is now available as a Flatpak package for Linux users. This change introduces the necessary desktop entry and metainfo files, enabling the app to be installed and run on Linux desktop environments via the Flatpak runtime. The package includes metadata for screenshots, branding colors, and release notes for versions 1.15.7 through 2.1.1, covering features such as voice message recording, chat stats, dynamic wallpapers, and various bug fixes.

flatpak · high confidence

Initial Windows build configuration and plugin registration

This change introduces the foundational CMake build scripts and generated plugin registrant files for the Windows platform. It enables the Flutter engine to link against the Windows DLL and sets up the build system to compile and link the C++ wrapper libraries required for the application runner and plugins. The generated registrant explicitly registers a suite of platform-specific plugins—including desktop\_drop, tray\_manager, window\_manager, and windows\_taskbar—ensuring that Windows-specific features like file dropping, system tray management, and window effects are available to the application.

linux/flutter, windows/flutter · high confidence

Initial project scaffolding and documentation

The repository has been initialized with core project documentation and configuration files. This includes the addition of \AGENTS.md\ and \CLAUDE.md\ to guide AI coding assistants, a \CODE\_OF\_CONDUCT.md\ establishing community guidelines, and a comprehensive \CONTRIBUTING.md\ detailing setup instructions for Android, Windows, Linux, and macOS development environments. The \README.md\ has been updated to describe the BlueBubbles cross-platform iMessage client features and installation steps, while the \LICENSE\ file establishes the Apache 2.0 terms. Additionally, \analysis\_options.yaml\ configures the Dart analyzer with a 120-character line width, and \.gitignore\ has been updated to exclude build artifacts, FVM caches, and sensitive signing keys.

(repo-wide) · high confidence

Introduce Custom Groups management in Settings

Users can now create, rename, and delete custom groups of chats within the Settings page. This feature allows organizing conversations by selecting specific chats for each group, reordering the groups themselves, and toggling the visibility of unread badges per group. The implementation provides platform-specific UIs for iOS (Cupertino), Material, and Samsung skins, all backed by a shared controller for state management.

_lib/app/layouts/settings/pages/custom\groups · high confidence

Introduce Find My device and friend location tracking interface

This change adds the initial UI and state management for the Find My feature, allowing users to view the live locations of their paired devices, tracked items, and friends on an interactive map. The layout adapts to different screen sizes, providing a side-by-side map and list view on tablets and a sliding panel interface on mobile devices. It includes custom map markers, location polling logic, and support for redacted mode to hide sensitive contact information.

lib/app/layouts/findmy · high confidence

Introduce animated dynamic wallpapers for chat backgrounds

Users can now apply animated backgrounds to individual chats, moving beyond static images. The system introduces four built-in animated styles—Waves, Floating Shapes, Drifting Circles, and Particles—each with a dedicated configuration screen allowing adjustments to speed, density, colors, and specific visual effects. These dynamic wallpapers are skin-agnostic, meaning the configuration UI adapts to the app's current theme, and they are persisted per-chat so users can customize the look of each conversation independently.

lib/app/components/wallpaper · high confidence

Introduce low-level color science engine for perceptually uniform theme generation

A new \lib/utils/color\_engine\ module has been added to power the dynamic theme system. It implements color space conversions (Linear sRGB, sRGB, Oklab, Oklch, CIE XYZ) and theme derivation logic, allowing the app to generate complementary and harmonious colors from a seed color using perceptually-uniform operations rather than naive RGB blending. This engine is consumed by \ThemesService\ to produce message bubble colors, avatar colors, and accent colors, ensuring better visual consistency across the UI.

_lib/utils/color\engine · high confidence

Introduce native Windows desktop application with splash screen and dark mode support

This change adds the native Windows runner for the BlueBubbles desktop application, enabling the app to run on Windows 7 and later. The implementation includes a custom CMake build configuration, a native splash screen that displays startup progress and a stall-detection close button, and a Win32 window host that supports per-monitor DPI scaling and automatic dark mode theming based on system settings. The executable is registered with the company name "BlueBubbles" and version 2.1.1.0, and the runner handles deep-linking to ensure a single instance of the app.

windows/runner · high confidence

Introduce redesigned message details popup with platform-specific actions

The message details popup (accessed via long-press or right-click) has been completely rewritten to support a unified, cross-platform action menu. This new popup includes a comprehensive set of actions such as Reply, Save, Open in Image Viewer, Copy Text/Attachment, Save Original, Save Live Photo, View Thread, Share, Re-download, Remind Later, Create Contact, Undo Send, Edit, Forward, Start Conversation, Copy Selection, Delete, Bookmark, Select Multiple, Message Info, Cancel Send, and Refresh Preview. Platform support is explicitly defined, with actions like Open in Image Viewer and Copy Attachment available on Desktop/Linux, while Share and Remind Later are restricted to Android. The popup also features a reaction picker with a custom clipper for the iOS-style tail, and handles gallery attachments by scoping the popup to the currently visible attachment.

_lib/app/layouts/conversation\view/widgets/message/popup · high confidence

Introduces custom Flutter widget overrides for platform consistency and error handling

The app now includes a new set of custom widget overrides in the \lib/app/components/custom\ directory to address platform-specific behaviors and improve error visibility. \CustomBouncingScrollPhysics\ reduces overscroll bounce on desktop environments, while \CustomCupertinoAlertDialog\ fixes text-scaling issues and adds proper dark/light mode theming for iOS-style dialogs. A \CustomCupertinoPageTransition\ provides an iOS-style slide animation with back-swipe support on Android, and a standardized \CustomErrorBox\ widget displays non-fatal errors with a consistent red-border design across the app.

lib/app/components/custom · high confidence

Introduces quoted reply bubbles and thread viewing UI

This change adds the visual components for message threading. It introduces a \ReplyBubble\ widget that displays a preview of the quoted message (including sender, text snippet, and attachments) above the main message, with platform-specific styling for iOS and Material designs. It also implements \ReplyLinePainter\ to draw the vertical connector lines between replies on iOS, and a \ReplyThreadPopup\ that opens a modal view showing the full conversation thread when a user taps the reply count badge.

_lib/app/layouts/conversation\view/widgets/message/reply · high confidence

Introduction of Material You theme presets and adaptive background theming

The themes service now includes a comprehensive set of Material You preset themes (including Vibrant, Expressive, Soft, Neutral, and various styles) and supports per-chat adaptive themes based on the chat background. This change introduces the \ThemesService\ class which manages these presets, integrates with dynamic color libraries (\dynamic\_color\, \flex\_color\_scheme\), and handles platform-specific initialization (such as deferred dynamic color loading on Linux to prevent splash screen freezing).

lib/services/ui/theme · high confidence

Introduction of shared data transfer objects for cross-platform compatibility

The \lib/database/global\ directory now contains a set of plain Dart classes (DTOs) that serve as the single source of truth for app settings, message structures, and server payloads across all platforms. These models—including \settings.dart\ with over 50 preference fields, \message\_part.dart\ for multi-part content, and \queue\_items.dart\ for outgoing actions—support serialization via \fromMap\/\toMap\ methods and are designed to be safe for use on web environments without ObjectBox annotations. This change establishes a unified data layer for core features like chat history, contact location tracking, and media handling.

lib/database/global · high confidence

Introduction of the Theme Studio panel for granular theme customization

A new Theme Studio panel has been added to the settings, providing a dedicated interface for managing and editing application themes. This feature introduces a controller-driven UI that allows users to select from preset themes, edit color palettes and typography, and manage custom theme definitions. The panel supports both global theme application and chat-scoped theming, enabling users to stage changes for preview before applying them to the live interface or specific chat contexts.

_lib/app/layouts/settings/pages/theming/theme\studio · high confidence

Native Linux splash screen with startup progress and stall detection

The Linux desktop now displays a native GTK splash screen that covers the main window while the Flutter engine initializes. This overlay shows the app version, a status log of startup steps, and a progress bar for long-running tasks like database migrations. If the app stalls for more than 30 seconds, a close button appears to allow the user to exit, and a link is provided to report the issue. The splash respects the user's dark/light theme preference and is removed once the Flutter UI is ready to render.

linux · high confidence

Native database layer for ObjectBox entities

This change introduces the native ObjectBox entity definitions for the database layer, including Chat, Message, Attachment, Handle, ContactV2, CustomGroup, ThemeStruct, and FCMData. These files provide the schema and persistence logic for non-web platforms, replacing or supplementing previous models. Key additions include support for custom chat themes and wallpapers, structured contact data with nickname and native contact priority, and improved message handling with attachment and reaction support.

lib/database/io · high confidence

Native support for notification replies, reactions, and auto-start

The app now handles notification interactions directly in native Android code, allowing users to reply to messages and send tapback reactions (likes/loves) from the notification shade even when the app is killed or not running in the foreground. It also introduces an AutoStartReceiver to automatically launch the foreground service after a device reboot if the 'keep app alive' setting is enabled, and adds an ExternalIntentReceiver to support Tasker automation for retrieving the server URL.

android/app/src/main/kotlin/com/bluebubbles/messaging/services/intents · high confidence

New API payload parser for event handling

A new \ApiPayloadParser\ class has been added to handle parsing of server event payloads. It distinguishes between legacy and new payload formats, routing new payloads to specific parsers for messages, chats, attachments, and handles. The implementation includes logic to enrich data by fetching full entities (like messages) via the \MessagesService\ when only GUIDs are provided, though enrichment for attachments, chats, and handles is currently marked as TODO.

lib/utils/parsers · high confidence

New Chat Stats page with detailed activity, engagement, and content analysis

A new Chat Stats page has been added to the conversation details layout, featuring a tabbed interface with Overview, Activity, Engagement, and Content sections. The Overview tab provides high-level metrics such as total messages, streaks, and a balance bar. The Activity tab visualizes message patterns through weekday/hour heatmaps, calendar views, and volume charts. The Engagement tab tracks response times, conversation openers/enders, double-texting, and balance drift. The Content tab, which requires an explicit user tap to analyze, reveals message length statistics, top words and emojis, reaction breakdowns, and attachment mixes. The page supports time-based filtering and allows comparing individual participants against the group or each other.

_lib/app/layouts/conversation\details/pages · high confidence

New Contacts Management settings page

A new Contacts Management page has been added to the Settings area, allowing users to manage contact permissions, manually sync device contacts to conversations, and export contacts to the desktop app. The page supports iOS, Material, and Samsung UI skins and includes features such as auto-sync toggling, account-specific filtering (e.g., WhatsApp, Google, Outlook), and diagnostic stats showing matched and updated conversation counts.

lib/app/layouts/settings/pages/contacts · high confidence

New Dart-side Android bridge and intent handling services

This change introduces a new \java\_dart\_interop\ module that consolidates the Dart-side implementation of the Android bridge. It adds \MethodChannelService\ to manage the \com.bluebubbles.messaging\ channel for communication with Kotlin (handling server URL updates, message events, and notification control), \IntentsService\ to route Android intents such as share targets, notification taps, and FaceTime calls, and \BackgroundIsolate\ to initialize the background isolate entry point for handling pushes when the app is killed. These services replace previous scattered implementations with a unified, documented bridge layer.

_lib/services/backend/java\_dart\interop · high confidence

New Desktop Settings Panel with Startup and Window Behavior Controls

A new \DesktopPanel\ settings page has been added, providing users with controls for desktop-specific behaviors. Key features include toggles to launch the application on startup, with an optional 'Launch on Startup Minimized' mode that hides the app to the system tray. On Linux, users can now configure the title bar style (Native, Custom, or Hidden) to manage window decorations and enable minimize-to-tray functionality. The panel also exposes a 'Show Startup Entry' option to reveal the path of the created shortcut or registry key.

lib/app/layouts/settings/pages/desktop · high confidence

New Find My UI widgets for devices, friends, and items

The Find My tracking screen now uses dedicated sub-widgets to display tracked Apple devices, shared-location friends, and AirTag-style accessories. Users see separate tabs for each category, with items grouped by whether they have a known location. Tapping a device or friend marker on the map focuses the view and shows a popup with name and address, while a directions button opens the location in an external map app. Long-pressing an item (when redaction is off) opens a debug dialog showing the raw JSON payload. Contact information is redacted when the app's redaction setting is enabled, and empty states indicate loading or lack of data.

lib/app/layouts/findmy/widgets · high confidence

New Kotlin utilities for API models and settings access

The app now includes Kotlin helper classes to support native Android functionality. ApiModels defines data structures for sending messages and tapbacks (reactions) via the API, enabling features like liking or loving from notifications. SettingsHelper provides a bridge to read Flutter-stored preferences (such as server address, auth keys, and notification reaction settings) directly from Kotlin code.

app · high confidence

New Material 3 Expressive component library

The app introduces a new set of UI components under the 'M3E' (Material 3 Expressive) design system. This includes a button group with connected rounded corners, list tiles with tonal icon containers, stat tiles with expressive color fills, and a section container that groups items with specific corner radii. The library also provides standardized motion specifications for animations and a slider theme with a thicker track and oversized thumb, all designed to replace older styling patterns with a more modern, cohesive look.

lib/app/components/m3e · high confidence

New Miscellaneous Settings panels for logging, troubleshooting, and data management

The Miscellaneous settings area now includes dedicated panels for managing application logs and data integrity. Users can view and filter saved log files by severity (Info, Debug, Warning, Error) in the Logging panel, or monitor real-time debug output in the new Live Logging panel. The Troubleshoot panel provides diagnostic tools, including the ability to download or share log files, reset the database, clear the cache, and resync data. Additionally, a new Soft-Deleted Chats panel allows users to view and restore chats that were previously deleted locally, and a Handle Audit panel helps diagnose and repair missing sender information for messages.

lib/app/layouts/settings/pages/misc · high confidence

New Setup Service for First-Run Server Connection

A new \SetupService\ has been introduced to orchestrate the initial server connection flow during onboarding. This service validates the server URL, tests connectivity, stores credentials, and triggers the initial full data sync. It ensures server details are fetched before the sync begins so that sync managers can access settings synchronously. The service is exclusively used from the setup layout during the first-run experience and marks the setup as complete by updating the \finishedSetup\ flag and triggering startup and network tasks.

lib/services/backend/setup · high confidence

New Storage Analyzer page in Settings

A new Storage Analyzer page has been added to the Settings layout, allowing users to scan and reclaim on-device storage. The page features a filter bar to narrow results by specific chats or age, and displays a breakdown of reclaimable space by media type (photos, videos, audio, documents, etc.) using a donut chart and segment rows. Users can select specific segments to delete via a floating action button, triggering a confirmation sheet that explains whether files are cached (regenerated automatically) or attachments (re-downloaded on next view). The implementation includes platform-specific UI skins for iOS (Cupertino) and Android (Material/Samsung M3 Expressive), a GetX controller managing analysis state and progress, and a cleanup flow that clears local caches and image caches upon deletion.

lib/app/layouts/settings/pages/storage · high confidence

New Theming & Visual Customization Settings Panel

A new dedicated settings page for visual customization has been introduced, allowing users to manage app themes, skins, and layout options. The panel includes controls for switching between light, dark, and system themes, selecting an app skin, and toggling tablet and immersive modes. It also provides a slider to adjust the avatar scale factor and serves as the entry point to the Theme Studio for advanced color and font customization.

lib/app/layouts/settings/pages/theming · high confidence

New UI helper library for dialogs, message rendering, and platform-specific overlays

The \lib/helpers/ui\ directory now contains a dedicated set of UI utility functions to standardize and improve the user interface across the app. Users will see more consistent dialog styling through \dialog\_helpers.dart\, which provides skin-aware (iOS, Material, Samsung) dialogs and confirmation prompts. Message rendering in \message\_widget\_helpers.dart\ has been enhanced to support rich text features like mention detection, entity extraction (links, dates, addresses), and proper emoji scaling. Additionally, new helpers introduce platform-specific capabilities such as FaceTime call overlays, Google OAuth flow management, and privacy-focused redacted mode for Find My markers.

lib/helpers/ui · high confidence

New advanced settings panels for notifications, privacy, and automation

The Advanced Settings section now includes dedicated configuration panels for power users. You can manage Firebase Cloud Messaging (FCM) configurations and toggle FCM on/off, choose between FCM and Unified Push as your notification provider (with a dedicated panel for configuring Unified Push endpoints and the ntfy.sh recommendation), and enable Redacted Mode to hide message content, avatars, and names in screenshots. Additionally, you can now toggle Private API features (such as tapbacks, read receipts, and typing indicators) and configure Tasker integration to send server events via Android Intent broadcasts.

lib/app/layouts/settings/pages/advanced · high confidence

New app permissions setup page for contacts and notifications

A new 'App Permissions' page has been added to the setup flow, allowing users to view and request Contacts and Notifications permissions. The page dynamically handles platform-specific requirements (such as Android 13+ notification permissions) and provides a confirmation dialog if the user attempts to proceed without granting all necessary permissions.

lib/app/layouts/setup/pages/permissions · high confidence

New backend-to-UI event bridge and keyboard shortcut system

A new subsystem in \lib/services/backend\_ui\_interop\ decouples backend services from UI widgets using a singleton \EventDispatcher\ for one-shot cross-cutting events (e.g., chat updates) and a set of Flutter \Intent\/\Action\ pairs for desktop keyboard shortcuts. The \intents.dart\ file defines bindings for actions such as opening settings, creating a new chat, searching, replying to the most recent message, and sending reactions (heart, like, dislike, laugh), which are registered in the widget tree via \Shortcuts\ and \Actions\ widgets.

_lib/services/backend\_ui\interop · high confidence

New background isolate system for heavy operations

The application now offloads database operations, synchronization, and message sending to dedicated background isolates. A persistent GlobalIsolate handles general heavy work with a 5-minute idle timeout, while a specialized IncrementalSyncIsolate manages sync tasks and terminates immediately after completion. This architecture ensures that critical actions like sending messages survive app backgrounding and that UI responsiveness is maintained by keeping long-running tasks off the main thread.

lib/services/isolates · high confidence

New camera review screen with pinch-to-zoom and native quality capture

A new full-screen camera review screen has been added for Android that launches the native system camera immediately upon navigation. It supports both photo and video modes, preserving native image quality by omitting manual compression settings. Users can interact with the captured media using pinch-to-zoom and double-tap-to-zoom gestures, and choose to either retake the media or confirm its use via the provided action bar.

lib/app/layouts/camera · high confidence

New centralized file system service for attachment and cache management

A new \FilesystemService\ has been introduced to centralize platform-specific path resolution and file operations for attachments, cache, and temporary files. This service manages the storage of chat avatars, URL previews (now using SHA-256 content-addressed hashing for security and deduplication), custom backgrounds, and fonts. It handles platform-specific logic, such as using the user-configured download path on desktop and the standard documents directory on mobile, while explicitly guarding against filesystem access on web platforms. The service also includes logic to migrate data from non-MSIX to MSIX installation locations on Windows.

lib/services/backend/filesystem · high confidence

New centralized helpers barrel and documentation

A new \lib/helpers/helpers.dart\ barrel file has been introduced to provide a single import point for cross-cutting utilities, re-exporting network, type, and UI helper modules. This change is accompanied by a new \CLAUDE.md\ documentation file that maps the structure of the helpers directory, clarifying which modules are exported via the barrel and which must be imported directly (such as \attributed\_body\_helpers.dart\ and \facetime\_helpers.dart\).

lib/helpers · high confidence

New chat creator recipient selection UI

The chat creator now uses a dedicated set of widgets to manage recipient selection. Users see a horizontal row of selected contact chips with an integrated text input for adding new recipients, and a scrollable list that displays matching existing conversations and address book contacts. The interface includes a toggle to switch between iMessage and SMS forwarding, and a picker to select the message service type. Contact search results are deduplicated by phone number or email, and phone numbers are automatically formatted for readability.

_lib/app/layouts/chat\creator/widgets · high confidence

New chat selector view with search and multi-select filtering

Introduced a new ChatSelectorView widget that allows users to search for chats using a debounced text field and, in multi-select mode, filter the list by All, Selected, or Unselected status via chip toggles. The view supports both single and multi-selection callbacks, pre-selecting specific chats based on initial GUIDs, and provides a 'Done' action to confirm selections in multi-select mode.

_lib/app/layouts/chat\_selector\view · high confidence

New chat statistics engine with comparison filters and detailed metrics

This change introduces a new chat statistics system that provides detailed engagement metrics, including message volume, activity patterns (by hour and day), response times, and conversation streaks. The implementation adds support for improved comparison filters, allowing users to analyze stats against specific participants or the whole group, and introduces new stat categories such as 'night owl' ratios and unattributed message counts. The system uses a multi-stage computation process to handle large datasets efficiently, scoped by timeframes (day, week, month, etc.), and includes specific logic for handling group chats, departed members, and read receipts.

_lib/services/ui/chat/chat\stats · high confidence

A new \constants.dart\ file introduces mappings for iMessage expressive effects (such as Slam, Echo, and Fireworks) and balloon bundle IDs for third-party extensions like GamePigeon, YouTube, and Google Maps. It also defines a \LinkPreviewPolicy\ enum that allows users to restrict automatic link preview fetching to contacts only or disable it entirely, addressing privacy concerns by preventing IP disclosure to unknown senders. Additionally, the file adds enums for client-side message errors, UI skins, and title bar styles.

lib/helpers/types · high confidence

New contact selection interface with search and redacted mode support

A new ContactSelectorView has been added, providing a user-facing interface to browse and select contacts. The view features a debounced search bar that filters contacts by display name or address, and respects the application's redacted mode setting to hide contact details when enabled. Users can tap a contact to select it and dismiss the dialog.

_lib/app/layouts/contact\_selector\view · high confidence

New conversation details dialogs for participant management, address selection, and chat syncing

The conversation details panel now includes dedicated dialogs for managing group chats and syncing history. Users can add participants to a group via phone number or email, with automatic contact lookup and validation. When sending to a contact with multiple addresses, a picker allows selecting the specific phone or email to use, with an option to remember the default. Renaming a group chat is handled through a dedicated dialog that supports both local and API-based updates. Additionally, manual chat syncing is now supported via a time-range picker (offering presets like 1 hour to all time) and a progress dialog that syncs messages in batches and updates the latest message indicator.

_lib/app/layouts/conversation\details/dialogs · high confidence

New conversation list filters with custom group support

The conversation list now supports a comprehensive set of combinable filters, allowing users to narrow chats by read status, sender type, chat type (group or direct), mute status, and service. A new quick-filter chip row appears above the chat list to toggle custom groups and ungrouped chats, with unread badges reflecting the filtered state. The filter sheet also includes options to clear filters, load saved defaults, and reset filters while saving them as the new default, ensuring consistent filtering behavior across sessions.

_lib/app/layouts/conversation\list/widgets/filters · high confidence

New developer scripts for version management and linting

Added \bump\_desktop\_versions.dart\ to automate updating the 4-digit desktop version across Windows resources, Snap, Linux build scripts, and Flatpak metadata, including support for beta releases and custom release tags. Also added \dart-fix-common-issues.sh\ to automatically apply common Dart lint fixes, and documentation in \CLAUDE.md\ explaining these new tools.

scripts · high confidence

New extension methods and documentation for common type helpers

Added a new \lib/helpers/types/extensions\ module containing a barrel file (\extensions.dart\) and documentation (\CLAUDE.md\). This module centralizes extension methods for types like \String\, \DateTime\, \MessageError\, and \Chat\, providing utilities such as date comparisons (\isToday\, \isWithin\), error code mapping, and UI helpers. It also introduces security-focused string handling via \withoutInvisibleFormatting\ to strip bidi overrides and normalize whitespace, and host-matching utilities for URIs. Users importing the \helpers\ barrel now have access to these standardized type extensions.

lib/helpers/types/extensions · high confidence

A new full-screen media viewer layout has been introduced, replacing the previous implementation with dedicated widgets for images and videos. For images, the viewer now supports pinch-to-zoom, tap-to-toggle overlays, and Live Photo playback, while also handling format conversions (such as HEIC/TIFF) for compatibility. For videos, the viewer now utilizes media\_kit, which includes specific Android color pipeline adjustments to fix blown-out HDR playback and corrects swipe navigation conflicts with video controls. The layout provides two entry points: a gallery holder for paging through chat attachments with reply-to-attachment support, and a single-item viewer for composer previews.

_lib/app/layouts/fullscreen\media · high confidence

New iMessage-style screen effects (Balloons, Fireworks, Lasers, Love, Spotlight, Celebration)

Users can now see full-screen overlay animations when sending messages with iMessage effects. This change introduces a new two-file architecture (controller classes and custom RenderBox rendering) for six effects: Balloons, Fireworks, Lasers, Love (Hearts), Spotlight, and Celebration (Confetti). These effects are rendered as custom paint operations and are triggered from the conversation view widgets.

lib/app/animations · high confidence

New iMessage-style send effects picker and playback

Users can now select and play visual send effects (such as fireworks, balloons, confetti, love, spotlight, lasers, celebration, and echo) when sending messages. This change introduces a new picker UI (\send\_effect\_picker.dart\) that allows effect selection before sending, and a background widget (\screen\_effects\_widget.dart\) that renders the full-screen animations triggered by the message send flow.

_lib/app/layouts/conversation\view/widgets/effects · high confidence

New iOS-native chat creator with service type selection and embedded previews

The chat creator now offers a new, iOS-native interface (\NewChatCreator\) that lets users select a specific service type (iMessage, SMS, or RCS) via a segmented control before composing. When a contact or chat is selected, the creator can display an embedded preview of the existing conversation; sending a message to that existing chat collapses the header and navigates to the full conversation view. The legacy multi-skin creator is retained as a deprecated reference (\ChatCreator\) alongside shared utility and dialog helpers, with the new implementation designed as a drop-in replacement for the existing call sites.

_lib/app/layouts/chat\creator · high confidence

New keyboard handlers for text field interactions

This change introduces four new handler classes within the conversation view's text field to manage specific keyboard interactions: ClipboardPasteHandler for handling paste operations (including GIFs, files, and images) on desktop platforms; EmojiAutocompleteHandler for cycling through and inserting emoji matches via arrow keys and Tab/Enter; MentionAutocompleteHandler for similar autocomplete behavior for @mentions, including a custom dialog for renaming mentions; and KeyboardShortcutHandler for general shortcuts like sending messages with Enter, editing the last sent message with Up arrow, and switching focus between subject and message fields with Tab.

_lib/app/layouts/conversation\_view/widgets/text\field/handlers · high confidence

New low-level utility library for core app functions

The \lib/utils\ directory now contains a collection of pure, low-level utility modules that replace scattered or ad-hoc implementations. This includes \crypto\_utils.dart\ for AES encryption compatible with CryptoJS, \emoji.dart\ and \emoticons.dart\ for advanced emoji handling and text-to-emoji conversion, \file\_utils.dart\ for cross-platform file operations (including Flatpak-specific file manager integration), \gif\_utils.dart\ to fix playback speed issues in GIFs with zero delay, \media\_kit\_hot\_restart\_fix.dart\ to prevent crashes during Flutter hot restarts on desktop, and \window\_effects.dart\ to manage Windows-specific visual effects like Mica and Acrylic with proper version gating. These utilities provide the foundational logic for features like location sharing, file handling, and UI theming without introducing business logic or service dependencies.

lib/utils · high confidence

New media attachment filters in conversation details

A new bottom-sheet UI has been added to the conversation details view, allowing users to filter media attachments by sender (From You, From Others, or specific participants), media type (Images or Videos), and date range. This feature integrates with the existing chat model to provide granular control over which media items are displayed in the conversation thread.

_lib/app/layouts/conversation\details/widgets/filters · high confidence

New network utility helpers and URL preview metadata entry point

This change introduces a new \lib/helpers/network\ directory containing pure utility functions for network operations. It adds \network\_helpers.dart\ to sanitize and normalize server URLs (handling schemes and tunnel providers), \network\_error\_handler.dart\ to classify send failures (Dio/HTTP errors) into user-friendly messages, and \network\_tasks.dart\ to manage network reconnection, localhost detection (including subnet scanning), and incremental sync triggers. Additionally, \metadata\_helper.dart\ serves as the entry point for URL preview metadata fetching, enforcing sender-based policies and managing the metadata cache.

lib/helpers/network · high confidence

New notification settings panel with text detection and reaction controls

A new Notification Panel has been added to the System settings, allowing users to manage how they are alerted. Key features include toggles for sending notifications while in the chat list, receiving notifications for message reactions, and a new 'Text Detection' feature that mutes all chats except when specific whitelisted phrases are found. The panel also includes options to hide message text previews in notifications, show toasts when incremental syncs complete, and enable quick reaction buttons from notifications (on non-web/desktop platforms with Private API enabled).

lib/app/layouts/settings/pages/system · high confidence

New profile panel for viewing and editing iMessage account details

A new ProfilePanel screen has been added to the settings layout, allowing users to view their iMessage account information and edit their display name and profile photo. The panel fetches account details via the HTTP service, handles null contact cards gracefully, and provides UI controls to update the user name or crop/remove the avatar image.

lib/app/layouts/settings/pages/profile · high confidence

New reaction type picker and consolidated settings widget exports

A new ReactionTypePicker widget has been added to the settings interface, allowing users to select from a list of reaction types with visual previews in both Private API and Notification settings. Additionally, the settings\_widgets.dart barrel file now exports a comprehensive set of UI components, including dropdowns, sliders, switches, tiles, headers, dividers, and scaffolds, centralizing access to these layout and content widgets for the settings screens.

lib/app/layouts/settings/widgets · high confidence

New reusable UI component library and documentation

The \lib/app/components\ directory now includes a comprehensive set of reusable UI widgets and a \CLAUDE.md\ guide to standardize their usage. This includes skin-aware controls (\BBSwitch\, \BBSlider\, \BBChip\) that adapt to iOS or Material/Samsung themes, a dynamic \AnimatedDropdownMenu\ for context-sensitive popups, and a \DonutChart\ with interactive legend filtering for data visualization. Additionally, new components like \ImageBlurCanvas\ for media backgrounds and \CircleProgressBar\ for loading states have been added to support consistent design across the application.

lib/app/components · high confidence

New reusable settings tile components and documentation

The settings UI now uses a dedicated set of building-block widgets in the content directory, documented in CLAUDE.md. These include SettingsTile (with active-page highlighting for tablet split-view), SettingsSwitch, SettingsOptions (dropdowns/segmented controls with a modern Material menu option), SettingsSlider, SettingsLeadingIcon (skin-aware icons), SettingsSubtitle, NextButton, AdvancedThemingTile (color-picker tile for theme customization), and LogLevelSelector (a dropdown to change app log verbosity).

lib/app/layouts/settings/widgets/content · high confidence

New scheduled messages and message reminders management in Settings

Users can now create, view, edit, and delete scheduled messages and message reminders directly from the Settings page. The feature includes dedicated panels for iOS (Cupertino), Material, and Samsung skins, each providing a native-looking interface for selecting a target chat, composing the message text, and choosing between one-time or recurring schedules (with configurable intervals). An overview header displays counts of pending, recurring, and completed messages alongside the next scheduled send time. Additionally, a separate Message Reminders panel allows users to manage local notification-based reminders, including editing their timing and deleting them.

lib/app/layouts/settings/pages/scheduling · high confidence

New server management and backup/restore settings panels

The server settings area now features a dedicated management panel for connection status, iMessage statistics (with a toggle between server and local sources), and Google OAuth sign-in for cloud relay. A redesigned backup and restore page allows users to manage settings and theme backups locally or on the server, and introduces the ability to export and import pinned chat orders and custom groups, with server/device-agnostic identification to handle chat matching across different environments.

lib/app/layouts/settings/pages/server · high confidence

New settings dialogs for themes, custom headers, and notifications

The settings interface now includes dedicated dialogs for managing application appearance and connection details. Users can create and manage custom themes via a new 'Create New Theme' dialog and view or delete legacy themes in the 'Old Themes' dialog. A new 'Custom Headers' dialog allows users to add, edit, or remove custom HTTP headers for API connections. Additionally, the 'Notification Settings' dialog provides granular control over chat-specific muting, including options to mute individuals in group chats, set temporary mutes with specific dates, and configure text detection filters.

lib/app/layouts/settings/dialogs · high confidence

New settings for chat list appearance, filtering, and pinned chat ordering

The Settings page now includes a dedicated Chat List section where users can toggle sync indicators, message status indicators, and chat filtering options (including filtering unknown senders and auto-unarchiving chats on new messages). Appearance controls allow hiding dividers and enabling dense conversation tiles. On iOS, users can also configure the pin grid layout (row counts for portrait and landscape) and reorder pinned chats via a new drag-and-drop panel that persists the custom order.

_lib/app/layouts/settings/pages/conversation\list · high confidence

New settings pages for managing custom avatars

The app now includes dedicated settings pages for customizing avatars. Users can set a personal avatar for their own profile, assign custom images to group chats, and manage color-coded avatars for individual contacts. The interface provides a gallery picker and image cropper for selecting and adjusting avatar images, with options to reset or update existing custom avatars directly from the chat list.

lib/app/layouts/settings/pages/theming/avatar · high confidence

New setup checks for battery optimization and macOS server configuration

The setup flow now includes dedicated checks for critical prerequisites. On Android, users are guided to disable battery optimization for BlueBubbles to ensure reliable notification delivery, with a direct link to settings if the exemption is not yet granted. For macOS users, a new check prompts them to confirm that the BlueBubbles Server is installed and iMessage is signed in, providing a link to the official installation instructions.

_lib/app/layouts/setup/pages/setup\checks · high confidence

New setup page template and documentation

Added a new CLAUDE.md documentation file describing the structure and flow of the first-run server connection setup steps (welcome, permissions, checks, sync). Introduced a new SetupPageTemplate widget that provides a consistent layout for these setup pages, including support for custom titles, subtitles, content wrappers, and navigation buttons, along with a PageContent helper for rendering text elements and a PageButtons component for handling next/back actions.

lib/app/layouts/setup/pages · high confidence

New startup screen components and documentation

Added the \SplashScreen\ and \FailureToStart\ widgets to handle the app's initial loading and error states, along with a \CLAUDE.md\ file documenting the startup flow. The splash screen displays the app icon and navigates to the setup view once the asset is loaded, while the failure screen presents error details and instructions for recovery.

lib/app/layouts/startup · high confidence

New structured logging system with file rotation and isolate support

The application now uses a dedicated logging utility (lib/utils/logger) that writes logs to rotating files (5 MB per file, keeping up to 5 rotated files) and streams them for live viewing. In debug mode, logs also appear in the console; on web builds, only the stream is active. The logger supports configurable log levels, ANSI color stripping for file outputs, and integrates with async tasks via a dedicated task logger that maps async errors and warnings to the main logger. It also initializes log directories and files safely to avoid path errors on first run.

lib/utils/logger · high confidence

New structured settings layout with search and tablet support

The settings interface has been restructured into a dedicated layout module featuring a new main entry point that supports tablet split-screen views and includes a built-in search bar to filter settings by title or tags. This change introduces a modular architecture with categorized pages (such as theming, server, and profile), reusable preference widgets, and specific dialogs for tasks like theme creation and notification permissions, replacing the previous flat implementation.

lib/app/layouts/settings · high confidence

New system integration handlers for contacts, calendar, downloads, and notifications

Added a suite of new Android method channel handlers in the system services layer to expose native device capabilities to the app. Users can now save files directly to the system Downloads folder (using MediaStore on Android 10+), open the native contact picker or view existing contacts, create calendar events, launch Google Duo calls, and open Chrome Custom Tabs for web links. Additionally, the app can now create and manage conversation-specific notification channels with bubble support on Android R+, and register dynamic share targets for quick access to chats.

android/app/src/main/kotlin/com/bluebubbles/messaging/services/system · high confidence

Redesigned conversation details page with multi-select attachment downloads

The conversation details view has been rewritten to support a new Material 3 Expressive design alongside the existing iOS style, featuring a reorganized layout with distinct sections for media, links, locations, and documents. A key behavioral change is the addition of multi-select capability for attachments: users can now select multiple photos, videos, or files within the details view and download them all at once using the new download action in the app bar. The view also includes improved filtering options for media by type (images/videos) and sender, as well as date range filtering for shared content.

_lib/app/layouts/conversation\details · high confidence

Redesigned server connection status and management interface

The server connection settings page has been completely revamped to provide a clearer, more detailed view of your BlueBubbles server status. The new interface displays real-time connection health for the API, Socket, Private API, and Helper Bundle in a visual grid, alongside key server information such as version, latency, and iCloud account status. Users can now easily copy the server URL to their clipboard and refresh stats with a single tap. The design is fully adaptive, offering distinct native experiences for iOS (Cupertino), Android (Material), and Samsung devices, ensuring the settings page feels at home on any platform.

_lib/app/layouts/settings/pages/server/connection\panel · high confidence

Redesigned welcome screen with confetti and bubble previews

The setup welcome page has been rewritten to include a new visual design featuring animated confetti effects and preview bubbles that mimic the iMessage interface. The page now displays a 'Welcome to BlueBubbles' message with a contact avatar and sample chat bubbles, providing users with a more engaging and illustrative first impression of the app's capabilities.

lib/app/layouts/setup/pages/welcome · high confidence

Reintroduces Firebase Cloud Messaging with dynamic server URL support

The app now supports receiving push notifications via Firebase Cloud Messaging (FCM) on Android. This change re-implements the Firebase integration to handle both Cloud Firestore and Realtime Database backends, allowing the app to dynamically fetch the server URL and listen for changes. It also includes logic to reinitialize Firebase if configuration changes mid-session and provides handlers to manage FCM tokens (fetching and deleting).

android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase · high confidence

Rewritten attachment rendering system with dedicated media widgets

The attachment display in conversation bubbles has been completely rewritten to use a new modular widget structure. A central \AttachmentHolder\ now dispatches to specific renderers based on MIME type, introducing dedicated widgets for images (\ImageViewer\), videos (\VideoPlayer\), audio (\AudioPlayer\), and generic files (\OtherFile\). This update adds support for displaying contact cards (\ContactCard\) and a new swipeable image gallery (\MessageImageGallery\) for messages containing multiple images. It also introduces full support for Live Photos via a new \LivePhotoMixin\ and improves the visual presentation of stickers with a new \StickerHolder\.

_lib/app/layouts/conversation\view/widgets/message/attachment · high confidence

Settings search feature with platform-specific UI and debounced filtering

Users can now search for settings panels by keyword across all settings pages. The new search interface includes a Material Design search bar and an iOS Cupertino-style variant, both featuring a 500ms debounce that triggers filtering only when the query is at least 3 characters long. Search results are displayed in a list with breadcrumb navigation showing the settings hierarchy path, and tapping a result navigates directly to the corresponding settings panel. The implementation includes dedicated widgets for the search input, result list, empty states, and breadcrumb tiles, along with a searchable item wrapper that supports title and tag-based matching.

lib/app/layouts/settings/widgets/search · high confidence

Standardized UI wrappers for consistent layout, theming, and desktop window management

The app now uses a new set of reusable wrapper widgets in lib/app/wrappers to standardize the user interface across all screens. BBScaffold and BBAnnotatedRegion handle consistent system UI overlay styling, safe area insets (including edge-to-edge support on Android), and window transparency effects. BBAppBar provides a unified header with platform-aware heights and automatic status bar color adaptation. TabletModeWrapper introduces a resizable split-view layout for desktop and tablet screens, allowing users to adjust the chat list and conversation pane ratios. TitleBarWrapper implements a custom desktop title bar with minimize-to-tray support and proper window control buttons on Windows and Linux. Additional wrappers include GradientBackground for animated chat wallpapers, ScrollbarWrapper for styled desktop scrollbars with middle-mouse scrolling, ThemeSwitcher for iOS/Material/Samsung skin variants, and TrackpadBugWrapper to fix macOS trackpad scrolling issues.

lib/app/wrappers · high confidence

Theme Studio widget components for color, typography, and theme management

The Theme Studio now includes dedicated widget components for editing and managing themes. Users can edit color palettes via collapsible sections with live swatch previews and hex copying, adjust typography with a font selector and master/per-style size sliders, and manage themes through actions like cloning, renaming, deleting, exporting, and generating palettes from seeds or images. A live preview card renders mockups of the app's UI to visualize changes across iOS, Material, and Samsung skins, while a theme selector strip organizes presets and custom themes into light/dark groups with deferred rendering for performance.

_lib/app/layouts/settings/pages/theming/theme\studio/widgets · high confidence

Windows desktop support added with installer and build tooling

BlueBubbles is now available on Windows. This change introduces the native Windows runner, CMake build configuration, and an Inno Setup installer that automatically installs required dependencies (Visual C++ 2015-2022 runtime and WebView2). The build pipeline supports both Microsoft Store submission (MSIX) and direct sideloading, with CI integration for code-signing via SignPath to ensure the binaries users run are signed.

windows · high confidence

Architecture

Conversation view page widgets and orchestration handlers introduced

The conversation view's top-level page structure has been reorganized into dedicated entry-point widgets: \ConversationView\ now acts as the outer container managing the \ConversationViewController\, keyboard interactions, and platform-specific headers (Cupertino or Material), while \MessagesView\ handles the scrollable message list, loading logic, and attachment of orchestration handlers. New handler components in the \handlers/\ directory manage desktop drag-and-drop (\DropZoneManager\), message entrance/highlight animations (\MessageAnimationOrchestrator\), and Smart Reply suggestion state (\SmartRepliesManager\), centralizing the logic previously scattered or tightly coupled within the view layers.

_lib/app/layouts/conversation\view/pages · high confidence

Introduce centralized cross-cutting data transfer objects

The \lib/models\ directory now serves as the single source for plain, serializable data classes (DTOs and View Models) used across the application, replacing scattered or ad-hoc data structures. This change introduces a comprehensive set of models including \ServerDetails\ (with version-based feature flags for server capabilities), \StorageAnalysis\ (for storage auditing and cleanup), \HandleAuditResult\ (for developer tools), and various sync and event models (\ChatSyncPage\, \HandleSyncPage\, \DispatchedEvent\). These classes are designed to be safe for cross-isolate communication and do not contain database annotations, providing a clean separation between persistent entities and transfer objects.

lib/models · high confidence

Introduce modular HTTP API service layer

The HTTP API client has been restructured into a modular service layer under \lib/services/network/api\. A new \BaseApi\ abstract interface defines the shared request contract (using Dio) to prevent circular imports, and distinct sub-services (\AttachmentApi\, \BackupApi\, \ChatApi\, \ContactApi\, \FaceTimeApi\, \FcmApi\, \FirebaseApi\, \HandleApi\, \iCloudApi\, \MessageApi\, \ServerApi\) now encapsulate specific server endpoints. This change organizes the network layer by domain, making it easier to maintain and extend individual API features without cluttering a single monolithic service class.

lib/services/network/api · high confidence

Major codebase restructuring and migration to GetX

The application has undergone a significant architectural overhaul, migrating the UI layer to the GetX state management framework and reorganizing the source code into distinct layers (app, services, database, helpers, models, utils). This change removes legacy placeholder files (such as the old conversation list and view widgets) and introduces a new entry point structure that supports background isolates and improved startup tasks. For users, this translates to a more robust and maintainable app foundation, enabling better performance, improved desktop window management, and a smoother initial load experience.

lib · high confidence

New isolate interface layer for backend operations

The app introduces a dedicated interface layer in lib/services/backend/interfaces that serves as the single entry point for all backend actions (chats, messages, contacts, attachments, sync, etc.). Every operation is routed through the GlobalIsolate (or IncrementalSyncIsolate for sync) to keep heavy work off the main thread, and results are automatically hydrated into full model objects from the local database before being returned to the service layer. This ensures that UI code never calls backend actions directly, improving responsiveness and simplifying the architecture.

lib/services/backend/interfaces · high confidence

New isolate-based action layer for backend services

The app introduces a new \lib/services/backend/actions\ directory containing pure functions that run inside a background isolate to handle database reads/writes and HTTP calls. This architecture offloads heavy I/O and ObjectBox operations (such as saving attachments, syncing contacts, managing chats, and sending messages) from the main UI thread, ensuring smoother performance and preventing UI jank during background tasks.

lib/services/backend/actions · high confidence

Refactored message popup actions into dedicated modules

The message popup action logic has been reorganized into four distinct files—media\_actions.dart, message\_actions.dart, navigation\_actions.dart, and text\_actions.dart—to improve code structure and maintainability. This change consolidates specific functionalities such as attachment handling (download, open, copy), message management (edit, delete, unsend, remind), navigation (reply, forward, new chat), and text operations (copy, open link) into their respective modules, ensuring that the popup menu interactions are more modular and easier to manage.

_lib/app/layouts/conversation\view/widgets/message/popup/actions · high confidence

Refactored preferences storage into typed category action classes

The app's settings persistence layer has been reorganized to use dedicated action classes for each preference category (admin, database, desktop, firebase, messaging, network, server, system, and theme). These classes wrap the underlying \SharedPreferencesService\ with strongly-typed getters and setters, replacing the previous pattern of accessing raw string keys directly. This change improves type safety and maintainability for app settings such as window dimensions, theme selections, and server version caching.

lib/services/backend/settings/actions · high confidence

Restructured service architecture with new barrel exports and documentation

The service layer has been reorganized into distinct subsystems (backend, network, ui, backend\_ui\_interop, isolates) to improve modularity. A new CLAUDE.md documentation file outlines the responsibilities of each service, while services.dart now acts as a centralized barrel export for all business logic and state services. This change consolidates access to services via GetIt singletons and reflects recent refactors such as merging GlobalChatService into ChatsService and replacing MessageUpdateCoordinator with MessageState.

lib/services · high confidence

Behavioural changes

Android messaging layer rewritten with UnifiedPush support and improved engine lifecycle management

The Android messaging component has been completely rewritten to improve stability and notification handling. A new \UnifiedPushReceiver\ now handles incoming push notifications via the UnifiedPush protocol, forwarding them to background workers and optionally forwarding events to Tasker. The core \MainActivity\ and new \BubbleActivity\ now manage the Flutter engine lifecycle with explicit readiness checks and synchronization to prevent race conditions during startup and destruction. Additionally, \MainActivity\ includes robust error handling for Firebase Firestore exceptions and ensures the foreground service is restarted via broadcast intent if the app is destroyed by the system while 'keep alive' is enabled.

android/app/src/main/kotlin/com/bluebubbles/messaging · high confidence

Android minimum SDK version raised to 23

The application now requires Android 6.0 (API level 23) or higher to run, replacing the previous minimum requirement of API level 21. This change aligns with the rewrite of the Android codebase and ensures compatibility with modern Android features and security standards.

android/app/src/main/kotlin/com/bluebubbles/messaging/models, android/app/src/main/kotlin/com/bluebubbles/messaging/services/filesystem · high confidence

Attachment picker rewritten for improved performance and memory efficiency

The media picker UI has been completely rewritten to optimize performance and reduce memory usage. The new implementation avoids loading full image bytes into memory by using file-path-based rendering for thumbnails, which significantly improves scrolling performance. It also handles incompatible image formats (like HEIC/HEIF) by converting them to compatible formats on-the-fly and generates video thumbnails efficiently. The picker now requests storage permissions when opening and integrates with the conversation view controller to manage picked attachments without preloading unnecessary data.

_lib/app/layouts/conversation\_view/widgets/media\picker · high confidence

Automated SignPath artifact configuration for Windows builds

Added a PowerShell script and generated XML configurations to automate the SignPath artifact definitions for the Windows build. The new \generate.ps1\ script scans the Release build output to distinguish between pre-signed vendor DLLs (which are verified) and unsigned application/plugin DLLs (which are signed), ensuring that newly added plugins cannot ship unsigned. This automation produces \app.xml\ for the main executable and \msix.xml\/\msix-test.xml\ for MSIX packages, while \installer.xml\ handles the installer executable, reducing the risk of manual configuration errors and ensuring consistent code signing across all bundled components.

windows/signpath · high confidence

Backend service layer rewritten with dedicated message handlers

The backend service layer in lib/services/backend has been completely rewritten to replace the previous monolithic approach with dedicated, specialized handlers. The new architecture introduces an ActionHandler to route server events, an IncomingMessageHandler to manage the inbound message pipeline (including deduplication, out-of-order buffering, and chat hydration), and an OutgoingMessageHandler to manage the outbound send pipeline (including serial queuing, pre-send preparation, and GUID replacement). Additionally, a new WebListeners utility provides stream-based message and chat updates for the web platform, replacing the previous ObjectBox DB listener functionality.

lib/services/backend · high confidence

Centralized message list management via MessagesServiceMixin

The conversation view now uses a new \MessagesServiceMixin\ to manage message state and UI updates. This mixin centralizes the initialization, disposal, and callback handling (new, updated, deleted, jump-to) for the \MessagesService\, ensuring that message controllers are properly linked to the conversation view controller. It also handles ownership transfer to prevent crashes when multiple views for the same chat exist (e.g., via notification taps) and provides methods for loading message chunks and creating message states, replacing direct subscriptions in widget \initState\ with a unified, lifecycle-aware approach.

_lib/app/layouts/conversation\view/mixins · high confidence

Centralized navigation service with tablet split-screen support

The app now uses a dedicated \NavigatorService\ (exposed as \NavigationSvc\) to handle all navigation, replacing direct calls to \Navigator.of(context)\. This service provides a unified entry point for route management, enabling consistent analytics, logging, and context-independent navigation. It introduces specific support for tablet and desktop layouts, including split-screen views where the chat list, chat detail, and settings can occupy separate panes. The service manages active state for these panes, allowing features like highlighting the active settings tile and handling complex back-navigation logic across multiple nested navigators in landscape mode.

lib/services/ui/navigator · high confidence

Chat list and conversation state rewritten with reactive service architecture

The chat list and conversation state management has been completely rewritten to use a new reactive service layer. A new \ChatsService\ now acts as the single source of truth for chat list state, managing a sorted list of chats and individual \ChatState\ objects for granular reactivity, replacing previous direct database access patterns. A new \ConversationViewController\ handles per-chat UI state, including media caching, text input, and reply context. Additionally, a \MessageListGate\ mechanism has been introduced to defer message list mutations during send animations, preventing visual glitches where the animation target shifts due to concurrent list updates. Custom group filtering is now supported via a dedicated \CustomGroupsService\.

lib/services/ui/chat · high confidence

Conversation header bar rewritten with skin-specific implementations and shared utilities

The conversation view header has been refactored into a structured, skin-based component system. It now features distinct implementations for iOS (Cupertino) and Material designs, routed via a ThemeSwitcher, while Samsung skin reuses the Material header. A new shared widget library (header\_widgets.dart) centralizes reusable components like the ManualMark button (for private API read receipts) and the ConnectionIndicator. This change introduces a blurred, gradient-based header for iOS and a standard Material AppBar for Android/Desktop, improving visual consistency and maintainability across platforms.

_lib/app/layouts/conversation\view/widgets/header · high confidence

Conversation list pages rewritten for iOS, Material, and Samsung skins

The conversation list UI has been completely rewritten to provide distinct, platform-native experiences for iOS (Cupertino), Material, and Samsung skins. The new implementation introduces dedicated page classes for each skin, each managing its own scroll controller and layout structure. Key behavioral changes include the removal of dividers in Material mode, the addition of a custom group filter chip row, and improved handling of pinned chats with specific layout logic for avatar-only views and pagination. The Samsung skin now features a dedicated footer and header, while the Material skin uses a centered floating action button and a distinct header. The iOS skin retains its traditional list view but with updated styling and filter support. These changes ensure that the conversation list adapts visually and interactively to the user's chosen skin, improving consistency and usability across platforms.

_lib/app/layouts/conversation\list/pages · high confidence

Conversation list tiles rewritten with reactive skins and new pinned layout

The conversation list tile system has been completely rewritten to use a reactive controller (\ConversationTileController\) that drives three distinct visual skins (Material, Cupertino, Samsung) via \ThemeSwitcher\. This change introduces a new horizontal layout for pinned chats (\PinnedConversationTile\) featuring a text preview bubble (\PinnedTileTextBubble\) and drag-and-drop reordering support (\DraggableConversationTile\). Swipe actions are now handled by a generic \ListItem\ wrapper for Material skins, while the new architecture ensures consistent reactive updates for highlights, unread states, and message previews across all platforms.

_lib/app/layouts/conversation\list/widgets/tile · high confidence

Database layer reorganized into lib/database with platform abstraction

The data persistence code has been consolidated into the new \lib/database\ directory, introducing a platform abstraction that separates ObjectBox entity definitions for mobile/desktop (\io/\) from shared DTOs (\global/\) and deprecated web stubs (\html/\). This change includes a database version bump to 9, updates the theme seeding version to 6 to force re-seeding of preset themes, and adds support for new entities such as \CustomGroup\ and \ThemeEntry\. The initialization logic now explicitly handles platform-specific store paths and includes a migration system that updates the database schema incrementally, while also ensuring data is cleared if the initial setup process is not completed.

lib/database · high confidence

Database migrations now show progress on the splash screen

When the app starts and needs to run database schema migrations (such as updating message-handle relationships or backfilling chat latest messages), the splash screen now displays a progress bar indicating how far along the migration is. This prevents the splash screen from timing out or appearing stalled during large database updates, providing visual feedback that the app is working.

lib/database/migrations · high confidence

Firebase services refactored with FCM disable toggle and improved error handling

The Firebase integration layer has been rewritten to improve reliability and user control. A new setting now allows users to disable FCM registration entirely, preventing unnecessary registration attempts and associated error banners when FCM is not in use. The FCM registration flow includes better error handling, such as retrying authentication with fresh server-provided credentials if the initial attempt fails, and specific handling for devices without Google Play Services. Additionally, the Firebase Database service now supports fetching server URLs via the database on web and desktop platforms, providing a fallback relay channel for message delivery when the direct socket connection is unavailable.

lib/services/network/firebase · high confidence

Fixes cross-isolate settings corruption and silent failures on Windows and Linux

The app now reliably saves and reads user settings on Windows and Linux by replacing the stock shared\_preferences backend with a custom implementation that prevents data loss. The previous stock backend cached preferences per isolate, causing writes from background isolates to be silently overwritten by main-isolate snapshots, and it wrote files non-atomically, leading to corruption and startup crashes. The new store eliminates caching, serializes all writes across isolates and processes using a lock file, and performs atomic writes with automatic backup restoration if corruption is detected. Additionally, the settings service now includes improved logging to prevent silent failures and ensures that critical bootstrap values (like callback handles) are correctly persisted across cold starts.

lib/services/backend/settings · high confidence

The Links section in conversation details now supports full-page search, allowing users to filter link previews by domain, title, or description with relevance-based sorting. The search helper introduces a scoring algorithm that prioritizes domain matches over titles and descriptions, and handles edge cases like Apple Music links where the URL is embedded in a specialization blob. The UI now displays link previews in a grid layout with proper loading states and infinite scroll for the full-page view.

_lib/app/layouts/conversation\details/widgets/sections/links · high confidence

Improved server connection flow with better validation and error handling

The server setup process now features a dedicated connecting dialog that waits for a fresh connection state transition, preventing stale connection states from causing incorrect UI feedback. Manual URL entry has been enhanced to automatically strip trailing slashes, validate URLs with ports more accurately, and enforce HTTPS on web platforms. Users also benefit from autofill hints for password managers and keyboard navigation (Tab/Shift+Tab) between the URL and password fields. Additionally, new error dialogs provide clearer messaging for connection failures and specific iMessage configuration issues, with an option to copy error details.

lib/app/layouts/setup/dialogs · high confidence

Introduce dedicated reaction display widgets with platform-specific styling and animations

The conversation view now uses a new set of widgets (\ReactionWidget\, \ReactionHolder\, \ReactionClipper\) to render tapback reactions. This change implements platform-specific visual styles: iOS reactions appear as solid circles without borders, while Material and Samsung skins display solid circles with borders. Reactions are positioned as overlays on the message bubble, with tail directions adjusted based on whether the message is sent or received. The implementation includes an animation for new reactions appearing (pop-in effect) and handles state updates reactively via \MessageState\. It also supports viewing reaction details in a slide-up panel and ensures proper rendering in contexts like pinned tiles by resolving message state explicitly.

_lib/app/layouts/conversation\view/widgets/message/reaction · high confidence

Introduce dedicated type-specific helper utilities

This change introduces a new set of pure utility functions in the helpers directory to standardize common operations across the app. Users will benefit from more reliable phone number formatting via the dlibphonenumber library, improved timestamp display that correctly respects 24-hour settings and chat skins, and safer file handling with robust filename sanitization. Additionally, message rendering is enhanced with better emoji support and text sanitization for ML Kit features, while contact display logic now prioritizes nicknames and native contacts more effectively.

lib/helpers/types/helpers · high confidence

Introduces reactive state wrappers for chats, messages, and attachments

The app now uses dedicated state classes (ChatState, MessageState, AttachmentState, and HandleState) that mirror database entities as granular reactive observables. This allows UI widgets to subscribe to specific fields—such as unread counts, delivery/read indicators, attachment transfer progress, and redacted-mode display names—so that only the relevant parts of the interface rebuild when data changes. Each state is exposed via an InheritedWidget scope (ChatStateScope, MessageStateScope, etc.) and is owned by its corresponding service (ChatsService, MessagesService, HandleService), ensuring that UI code never writes directly to the state but instead routes updates through service methods.

lib/app/state · high confidence

Message view UI and interaction overhaul

The message rendering system has been significantly restructured to improve reliability and user experience. A new modular widget architecture (documented in CLAUDE.md) separates concerns into specialized components for text, attachments, reactions, replies, and timestamps, replacing the previous monolithic implementation. This refactor introduces a robust send animation that correctly handles dynamic layout changes (such as typing indicators and smart replies) to prevent visual glitches. Additionally, the update adds support for viewing past message edits, improves the accuracy of reply line rendering and thread connections, fixes issues with multi-part message replies, and enhances the reaction details popup to display user avatars and names.

_lib/app/layouts/conversation\view/widgets/message · high confidence

Native logs are now persistent and exportable; file URI resolution and icon scaling improved

Native Android logs are now written to a persistent file in the app's log directory alongside Dart logs, making them survive logcat rollover and included in the app's log export. A new FilesystemUtils helper resolves file paths from various Uri sources (Storage Access Framework, MediaStore, DownloadsProvider) to support reliable file handling. Additionally, adaptive icon generation now safely handles portrait images by avoiding a divide-by-zero error when computing aspect ratios.

android/app/src/main/kotlin/com/bluebubbles/messaging/utils · high confidence

New UI state services for contacts, handles, and attachments

The app introduces dedicated services in lib/services/ui to manage UI-side state for contacts, handles, and attachments. ContactServiceV2 now handles contact permissions with debounced sync and throttled re-checks, and exposes a management page with account contact counts and manual refresh stats. HandleService centralizes HandleState creation and caching, pushing contact-sync updates and reacting to redacted-mode, hide-contact-info, fake-avatar, and reaction-name settings. AttachmentsService tracks file attachments in the composer and send progress, supporting temp attachments, auto-download, and HEIC/TIFF conversion, while UnifiedPush provides a settings-backed push notification provider abstraction.

lib/services/ui · high confidence

New conversation list floating action button and initial state widget

The conversation list now features a new floating action button (FAB) implementation that adapts to the user's selected skin (iOS, Samsung, or Material). On iOS and Samsung skins, the FAB includes a camera option if enabled, while the Material skin adds a scroll-to-top button that appears when scrolling up. Additionally, a new initial state widget displays a "Select a chat from the list" message when no chat is selected, with background transparency that respects the user's window effect settings.

_lib/app/layouts/conversation\list/widgets · high confidence

New granular settings panels for attachments, conversations, and input customization

The message view settings have been reorganized into dedicated, user-configurable panels. Users can now manage attachment behavior, including toggling auto-download (with an optional WiFi-only mode), setting the maximum number of concurrent downloads, adjusting image preview quality, and configuring auto-save locations for pictures and documents on non-web/desktop platforms. Conversation preferences now include controls for delivery timestamps, chat name placeholders, avatar visibility, smart reply suggestions, and reply threading behavior, alongside a new policy selector for link preview loading to protect privacy. Additionally, users can customize the composition experience by reordering and enabling/disabling buttons in the text field toolbar, and fully reorder the actions available in the message context menu via a dedicated drag-and-drop interface.

_lib/app/layouts/settings/pages/message\view · high confidence

New message state management service

The message UI layer now uses a dedicated \MessagesService\ to manage per-chat message state, replacing the previous approach where widget controllers handled state locally. This service maintains a central map of \MessageState\ objects keyed by message GUID, providing granular reactivity through an update trigger map so widgets can efficiently rebuild only when specific messages change. It handles message insertion, updates, and lifecycle management, ensuring that UI components like reply bubbles and delivery indicators reflect the current state immediately and consistently.

lib/services/ui/message · high confidence

New optimized reactive tiles for Connection, Private API, and Redacted Mode settings

The settings interface now includes dedicated, optimized reactive widgets for Connection & Server status, Private API Features, and Redacted Mode. These new tiles provide real-time visual feedback on connection states (Connected, Disconnected, Error, etc.) and feature statuses, allowing users to quickly assess their server connection and advanced settings. The Connection tile also enables long-press copying of the server address to the clipboard, while the Private API and Redacted Mode tiles clearly indicate their current enabled/disabled state with color-coded indicators.

lib/app/layouts/settings/widgets/tiles · high confidence

New structured onboarding flow with platform-specific checks and sync configuration

The setup layout has been restructured into a multi-step onboarding wizard (\setup\_view.dart\) that guides users through platform-specific permission checks (macOS permissions, Android battery optimization), contact and notification permission requests, server connection (via QR code or manual entry), and initial sync configuration (message count, time filter, group icons). The flow is orchestrated by \SetupViewController\ and includes recovery dialogs for connection or scanning failures. This change introduces a new, more robust entry point for first-time setup, replacing the previous ad-hoc setup logic with a standardized, page-based experience.

lib/app/layouts/setup · high confidence

New text bubble widget with animated effects and colorful bubble support

The conversation view now uses a dedicated \TextBubble\ widget to render individual message parts. This component introduces support for the 'Gentle' send animation effect, which scales the text bubble upon sending. It also implements 'colorful bubbles' for received messages, applying gradients based on the sender's handle color when enabled. The widget handles rich text rendering (bold, italic, mentions, links) via \AttributedBodyHelpers\, displays strikethrough for edited messages, and shows an 'Unsent' label for pending parts. Selection highlighting and bubble darkening for temporary messages are also integrated into this specific rendering layer.

_lib/app/layouts/conversation\view/widgets/message/text · high confidence

Reactive contact and group avatar widgets with customizable colors

The app now uses new \ContactAvatarWidget\ and \ContactAvatarGroupWidget\ components that reactively update when contact details or group participants change, eliminating manual subscription overhead. Users can now tap an avatar to open a color picker and assign a custom gradient color to a contact, with an option to reset to the default address-based gradient. Group avatars intelligently sort participants to prioritize those with profile photos and support a configurable maximum display count, showing a blurred overlay with a group icon when more participants are present than can be shown.

lib/app/components/avatars · high confidence

Redesigned Documents and Locations sections with search and filtering

The Documents and Locations sections in the conversation details view have been rewritten to support full-page browsing with search and filtering capabilities. The Documents section now includes a search helper that ranks file attachments by filename and MIME type, allowing users to filter and sort files within the full-page view. The Locations section has been updated to display location attachments in a masonry grid layout, with support for filtering by sender and date. Both sections now feature consistent UI patterns including section headers, loading indicators, empty states, and pagination for large sets of attachments.

_lib/app/layouts/conversation\_details/widgets/sections/documents, lib/app/layouts/conversation\details/widgets/sections/locations · high confidence

Redesigned Material/Samsung conversation details with per-chat theming

The Material and Samsung skins for the conversation details page have been rewritten to use a new expressive UI. The header now features a connected quick-action button group, and the options panel is reorganized into labeled sections (Appearance, Conversation, Content & data, Danger zone) with tonal backgrounds. A new per-chat theming system allows users to set custom light and dark themes and dynamic wallpapers, with the header and tile colors adapting to the selected theme. Group chat photo management now supports both local and Private API methods for updating or removing icons.

_lib/app/layouts/conversation\details/widgets · high confidence

Redesigned advanced theming interface with master font scaling and music theme integration

The advanced theming settings page has been rewritten to provide a more polished user experience, featuring a unified master slider that scales font sizes across both light and dark themes. The interface now includes a dedicated 'Create New' button for custom themes and a 'View Old' option to access legacy theme configurations. Additionally, selecting the 'Music Theme' presets automatically requests notification listener permissions to enable dynamic color extraction from media playback.

lib/app/layouts/settings/pages/theming/advanced · high confidence

Redesigned conversation list headers with platform-specific UI and filter controls

The conversation list screen now uses distinct header widgets for iOS (Cupertino), Material, and Samsung One UI skins, each providing a tailored look and feel. A new header widget allows users to toggle chat list filters directly from the header when the 'Show filters in header' setting is enabled, with the filter icon highlighting when active. The headers also feature improved overflow menus, sync indicators, and responsive layouts for desktop, web, and tablet modes.

_lib/app/layouts/conversation\list/widgets/header · high confidence

Redesigned iMessage stats page with platform-specific skins and local/server toggle

The iMessage stats page in Server Settings has been completely redesigned to support distinct visual skins for iOS (Cupertino), Material, and Samsung interfaces, ensuring the stats display matches the user's chosen theme. The page now includes a segmented control allowing users to toggle statistics between the 'Server' and 'Local DB' sources, with a note that Local DB stats are unavailable on web builds. The layout presents totals for messages, chats, handles, attachments, images, videos, and locations using themed stat cards and media rows, and supports pull-to-refresh for updating the data.

_lib/app/layouts/settings/pages/server/imessage\stats · high confidence

Redesigned iOS splash screen with adaptive theming and status bar visibility

The iOS launch experience has been updated to support adaptive theming. The splash screen now uses a background image layer to allow for dynamic theming, and the launch image dimensions have been standardized to 600x600 pixels. Additionally, the app configuration now explicitly ensures the status bar remains visible during the launch sequence.

ios/Runner · high confidence

The media section in conversation details now features a new responsive grid layout that adjusts column counts based on screen width, along with a new filter selector widget that adapts its style to the current platform skin (using Cupertino controls on iOS and Material 3 segmented buttons elsewhere). Users can now filter media by type and sender, and the grid supports selection modes with visual feedback, improving the browsing and management of attachments within conversations.

_lib/app/layouts/conversation\details/widgets/sections/media · high confidence

Redesigned setup flow with QR scanning and Google authentication

The setup process for connecting to a BlueBubbles server has been completely overhauled. Users can now scan a QR code displayed on their server to automatically populate connection details, or manually enter the URL and password. For Google-authenticated servers, the new flow supports signing in via Google to automatically discover and select the correct Firebase project, streamlining the connection process. The sync configuration screen now offers granular controls for message limits, time filters, and options to skip empty chats or sync group icons, while the completion screen provides a direct shortcut to restore backups.

lib/app/layouts/setup/pages/sync · high confidence

Redesigned typing indicator with platform-specific visuals and animations

The typing indicator in conversation views has been rewritten to provide a more polished, platform-aware experience. On iOS, it now displays the sender's avatar alongside the animated dots, matching the native iMessage style, while other platforms show a rounded bubble with a tail. The animation uses a staggered bounce effect for the dots and a scale transition for the bubble's appearance and disappearance, anchored at the bottom-left to simulate a real speech bubble growing from the sender. This change improves visual clarity and user feedback during active typing.

_lib/app/layouts/conversation\view/widgets/message/typing · high confidence

Refactored attachment rendering with granular state-based widgets

The attachment display logic in conversation messages has been restructured into distinct, per-state widgets to improve clarity and maintainability. The system now explicitly separates the rendering of attachments based on their transfer lifecycle: placeholders for unloaded media, dedicated views for download and upload progress (including byte counts and cancellation options), and specialized viewers for resolved content. This change introduces support for rendering Apple Wallet passes (pkpass) directly within the chat, adds a reusable corner-badge component for media type indicators, and implements a unified opacity wrapper to visually indicate when a message is actively sending. Users will see more consistent progress feedback during transfers and the ability to view pass-type attachments without leaving the conversation.

_lib/app/layouts/conversation\view/widgets/message/attachment/parts · high confidence

Refactored conversation header into shared, reusable components

The conversation view header logic has been extracted into a shared library to eliminate duplication across platform-specific implementations (Cupertino, Material, and Samsung). This change introduces a \ChatTitleMixin\ that centralizes title and subtitle resolution by delegating directly to \ChatState\, ensuring consistent display names across all platforms. Additionally, common UI elements such as the send progress indicator, back button with unread count badge, and the combined chat title/avatar widget are now provided as reusable shared components, simplifying the platform-specific header widgets and improving maintainability.

_lib/app/layouts/conversation\view/widgets/header/shared · high confidence

Refactored conversation view handlers for stability and performance

The conversation view's handler layer has been restructured into dedicated managers to improve reliability and maintainability. A new DropZoneManager replaces the previous drag-and-drop implementation, resolving random crashes by using a simpler, more robust approach for handling file attachments. Message animations are now orchestrated by a centralized MessageAnimationOrchestrator with a dedicated configuration class, ensuring consistent slide, size, and fade transitions for sent and received messages without visual overlap. Additionally, the SmartRepliesManager has been updated to manage ML Kit context more effectively, enforcing a rolling window of recent messages to prevent memory issues and ensuring proper sanitization of text before processing.

_lib/app/layouts/conversation\view/pages/handlers · high confidence

Refactored data synchronization into dedicated managers with improved reliability and server compatibility

The sync logic has been restructured into distinct managers (Full, Incremental, Chat, and Handle) to improve code organization and maintainability. Incremental sync now supports server versions 1.6.0+ using row IDs for more efficient delta updates, while retaining compatibility with older servers via timestamps. The system now includes a Handle Sync Manager that requires server v1.5.2+, allowing for the synchronization of phone/email handles with automatic rollback on failure. Additionally, incremental sync runs in a background isolate to prevent UI freezing, and Windows desktop users now see real-time progress updates in the taskbar during full and chat syncs.

lib/services/backend/sync · high confidence

Refactored interactive message rendering with dedicated widgets and URL preview redesign

The interactive message rendering system has been restructured into a dedicated directory with a new \InteractiveHolder\ entry point that routes Apple payload data to specific widgets. This introduces dedicated renderers for Apple Pay, Game Pigeon, and embedded media (maps, music, iBooks), while completely rewriting the URL preview logic. The URL preview now features a \UrlPreviewController\ for centralized fetch and cache management, supports three distinct card shapes (hero, compact, bare) based on available metadata, and includes platform-specific skins for iOS (Cupertino) and Material/Samsung (Expressive) themes. The refactoring also improves handling of payload artwork, favicon display, and auto-fetch retry logic for contacts.

_lib/app/layouts/conversation\view/widgets/message/interactive · high confidence

Refactored logging outputs with improved concurrency and file handling

The logging system in lib/utils/logger/outputs has been restructured to introduce dedicated output classes: DebugConsoleOutput for debug prints, LogStreamOutput for stream-based logging, and FileOutputWrapper to strip ANSI codes before writing to files. A new RotatingFileOutput implementation replaces previous logic, addressing critical issues with concurrent isolate writes and Windows file locking by using atomic append-mode writes and in-place truncation instead of file renaming, ensuring log lines are no longer lost or corrupted across isolates.

lib/utils/logger/outputs · high confidence

Refactored message bubble composition into isolated, granular widgets

The message bubble layout in the conversation view has been restructured to improve rendering performance and maintainability. The previous monolithic widget tree has been decomposed into specialized, isolated sub-widgets (such as \ReactionObserver\, \StickerObserver\, \ReplyBubbleSection\, and \DeliveredIndicatorObserver\) that use independent \Obx\ scopes. This change ensures that updates to specific message attributes—like reactions, stickers, or error states—trigger only the relevant parts of the message row to rebuild, rather than the entire message bubble. Additionally, the reply bubble section now correctly scopes the state of the quoted message, ensuring that reply previews display the original content accurately.

_lib/app/layouts/conversation\_view/widgets/message/message\holder · high confidence

Refactored message error handling and added clone scope for popup stability

This change introduces a \MessageCloneScope\ widget to prevent duplicate side-effects when message bubbles are rendered as decorative clones in popups, ensuring that actions like refreshing previews only trigger once. It also replaces ad-hoc error handling with a centralized \MessageErrorHelper\ and \MessageErrorDialog\, providing consistent error titles and body text (including specific iMessage error codes) and shared retry/remove logic for both messages and reactions.

_lib/app/layouts/conversation\view/widgets/message/shared · high confidence

Refactored message rendering and added inline editing

The message view widgets have been reorganized into a dedicated \misc\ folder to improve maintainability. A new \MessagePartContent\ dispatcher centralizes the logic for routing message parts to their specific renderers (text, attachments, or interactive content). The system now supports inline message editing via a new \MessageEditField\ widget with keyboard shortcuts. Additionally, swipe-to-reply interactions are handled by a new \SwipeToReplyWrapper\, and bubble send effects (including invisible ink) are managed by a new \BubbleEffects\ component.

_lib/app/layouts/conversation\view/widgets/message/misc · high confidence

Refactored message timestamp and delivery status display

The timestamp and delivery status components in the conversation view have been restructured into dedicated widgets (MessageTimestamp, DeliveredIndicator, TimestampSeparator) with improved reactivity and skin-specific behaviors. Timestamps now slide in on tap for iOS, remain inline for Material, and are always visible for Samsung skins. Delivery indicators (Sent, Delivered, Read, Sending) are now debounced to prevent flickering during animations and correctly handle edge cases like unsent messages and audio retention. Date separators between different calendar days are now consistently displayed with adaptive styling based on custom wallpapers.

_lib/app/layouts/conversation\view/widgets/message/timestamp · high confidence

Refactored message view components and added notification controls

The conversation view's message display logic has been reorganized into extracted widget components to improve code structure and isolate rebuilds. This change introduces a dedicated banner for chats with silenced notifications, including a 'Notify Anyway' button that allows users to manually trigger a notification for a specific message. Additionally, the smart replies row has been updated to dynamically adjust its layout and styling based on whether the chat has a custom wallpaper, ensuring visual consistency with the chat's background theme.

_lib/app/layouts/conversation\view/widgets · high confidence

Regenerated web splash screen assets

The web splash screen implementation has been updated with new JavaScript and CSS files. The JavaScript now explicitly removes the splash container and branding elements while setting the body background to transparent upon loading. The CSS has been redesigned to support various image fitting modes (contain, stretch, cover) and positioning (center, bottom, bottom-left, bottom-right), and includes a media query to switch the background color to black in dark mode.

web/splash · high confidence

Reimplemented message composer with modular widget structure

The conversation view's text input area has been completely rewritten as a modular component set, replacing the previous monolithic implementation. The new structure includes dedicated widgets for the main composer orchestration, local state management (handling drafts, typing indicators, and selection tracking), and specific UI elements like the send button, icon bar, reply holder, and picked attachment chips. It introduces new handlers for clipboard pasting, emoji and mention autocompletion, and desktop keyboard shortcuts, along with a helper for text matching. This refactor isolates concerns, improves performance by reducing rebuild scopes, and standardizes the composer's behavior across platforms.

_lib/app/layouts/conversation\_view/widgets/text\field · high confidence

Reliable background task execution via WorkManager and engine race fixes

The app now uses a new WorkManager-based system (DartWorkManager and DartWorker) to handle background Dart tasks, ensuring that events like notification replies are processed even when the app is killed or the engine is cold-starting. This implementation fixes previous race conditions and crashes by introducing a mutex for engine state transitions, handling large payloads that exceed WorkManager's size limits by spilling them to disk, and adding retry logic with exponential backoff for transient failures. Additionally, a centralized MethodCallHandler has been introduced to route method calls to specific service handlers, improving code organization and reliability.

_android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend\_ui\interop · high confidence

Removal of legacy Android MainActivity boilerplate

The custom MainActivity class in the Android app has been removed. This file previously contained manual plugin registration logic via GeneratedPluginRegistrant, which is no longer required as the Flutter engine handles plugin registration automatically in modern versions.

android/app/src/main/kotlin/com/example · high confidence

Rewritten URL preview metadata pipeline with improved parsing and security

The URL preview system has been completely rewritten to replace the previous \metadata\_fetch\ dependency. This change introduces a new metadata extraction pipeline that fetches and parses Open Graph, Twitter Card, JSON-LD, and oEmbed data with stricter security guards against SSRF and private network access. Users will see more reliable link previews, including better handling of non-UTF-8 encodings, improved favicon support, and site-specific refinements for platforms like YouTube and Reddit. The new system also manages preview storage directly from the analyzer, reducing redundant fetches and improving performance through single-flight caching and concurrency limits.

lib/helpers/network/metadata · high confidence

Rewritten app lifecycle service with improved foreground handling and race-condition fixes

The app lifecycle service has been rewritten to better manage state transitions, particularly on Android. It now distinguishes between being 'alive' (process running) and 'in the foreground' (UI visible), preventing issues where backgrounded apps incorrectly reported as active. Key improvements include canceling isolate drains on resume to prevent dropped foreground messages, ensuring socket connections resume correctly without backoff delays, and managing an Android foreground service to keep the app alive when backgrounded (if the 'keep app alive' setting is enabled). The service also fixes race conditions during startup and resume that previously caused missed notifications or stale chat states.

lib/services/backend/lifecycle · high confidence

Rewritten network layer with improved connection resilience and certificate handling

The network communication layer has been restructured to provide more reliable connectivity and better support for custom server configurations. The new \SocketService\ strictly separates transient reconnection (handled by socket.io with capped backoff), URL rediscovery (checking Firebase for server moves), and lifecycle gating (stopping connections when the app is backgrounded), which prevents stale states and connection leaks. HTTP requests now use a centralized \HttpService\ with sub-services for each domain (chat, messages, attachments, etc.), featuring automatic retries for 502 Cloudflare errors and support for custom headers like \ngrok-skip-browser-warning\. Certificate validation has been improved to trust user-installed certificates on Android and accept self-signed certificates via a custom \badCertificateCallback\, ensuring connectivity with local or custom TLS setups. Attachment downloads are now managed by a dedicated \AttachmentDownloadService\ that prioritizes downloads in the active chat and handles concurrent downloads with a state machine (queued → downloading → processing → complete/error).

lib/services/network · high confidence

Rewritten notification service with robust desktop support and serializable query descriptors

The notification backend has been completely rewritten to improve reliability and cross-platform consistency. On desktop (Windows and Linux), notifications now use a dedicated \DesktopNotifications\ adapter that encodes chat context and interaction data (actions, replies) into the toast payload, ensuring that taps and button clicks are correctly routed even if the app was restarted or the in-memory state was lost. The service now supports custom notification sounds on Windows, handles FaceTime call alerts with automatic cancellation on timeout, and properly clears notifications for the active chat without disturbing others. Additionally, a new \AttachmentQueryDescriptor\ class enables serializable, cross-isolate attachment queries for the ObjectBox database, replacing non-serializable condition objects to prevent crashes during background processing.

lib/services/backend/notifications · high confidence

Rewritten notification system with new handlers and media integration

The notification service has been completely rewritten to improve reliability and add new capabilities. Incoming FaceTime calls now display dedicated Answer and Ignore actions on the notification. Message notifications support quick replies, marking as read, and liking/loving directly from the notification shade, with improved deduplication logic to prevent duplicate alerts. The system now manages notification channels more robustly, including a one-time migration to ensure vibration works correctly for new messages and setting the foreground service channel to low importance to avoid intrusive heads-up notifications. Additionally, the app can now listen to media sessions to extract album art for dynamic theming, and supports UnifiedPush for receiving messages via alternative push gateways.

android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications · high confidence

Standardized backend service initialization and startup sequence

The app now uses a centralized, dependency-ordered startup sequence in \lib/helpers/backend/startup\_tasks.dart\ to initialize core services (such as Filesystem, Settings, Database, and Socket) in a strict order, ensuring reliable background operation and notification delivery. This change also introduces helper utilities for managing server settings and Android foreground services, which helps prevent crashes on startup and ensures the app remains alive in the background when configured.

lib/helpers/backend · high confidence

Standardized settings page layout components

The settings interface now uses a dedicated set of structural widgets (\SettingsScaffold\, \SettingsSection\, \SettingsHeader\, \SettingsDivider\) to ensure consistent spacing, visual hierarchy, and platform-specific styling across all settings panels. This change introduces a unified pattern for grouping settings into rounded cards with appropriate dividers, handling platform-specific nuances such as iOS-style shadows and Samsung-specific scroll behaviors, while replacing ad-hoc layout code with these reusable building blocks.

lib/app/layouts/settings/widgets/layout · high confidence

System chat events now display message info on long press and adapt to custom backgrounds

The chat event widget, which renders system-generated messages like group changes or unsent notifications, now supports a long-press gesture to display a detailed 'Message Info' dialog containing the message's metadata. Additionally, the visual styling of these events has been updated to respect custom chat wallpapers; when a custom background is active, the event text is wrapped in a semi-transparent container to ensure readability, whereas it remains plain centered text against standard backgrounds.

_lib/app/layouts/conversation\_view/widgets/message/chat\event · high confidence

Updated LLDB debugging integration files

The iOS ephemeral Flutter directory now includes regenerated LLDB helper scripts (flutter\_lldb\_helper.py and flutter\_lldbinit). These files enhance the debugging experience by automatically intercepting memory page notifications during debugging sessions, ensuring that read-execute-write memory protections are handled correctly without manual intervention.

ios/Flutter/ephemeral · high confidence

Updated ObjectBox database schema and generated code

The ObjectBox model and generated Dart code have been regenerated to reflect changes in the underlying data model. This update includes new or modified properties for entities such as Attachment (e.g., exif, metadata) and Chat (e.g., customAvatarPath, textFieldText), ensuring the local database layer stays in sync with the application's data requirements.

lib/generated · high confidence

Updated macOS plugin registrant for Flutter 3

The macOS build now uses a regenerated plugin registrant (GeneratedPluginRegistrant.swift) and corresponding xcconfig files to support Flutter 3. This update ensures that all native plugins—such as video playback, local notifications, and window management—are correctly registered with the Flutter engine, aligning the macOS platform with the broader Flutter 3 dependency upgrades.

macos/Flutter · high confidence

Web platform database support deprecated with stub implementations

The \lib/database/html/\ directory now contains stub implementations of the ObjectBox entity classes (Chat, Message, Attachment, Handle, Theme, etc.) that compile for the web platform where ObjectBox is unavailable. These files mirror the API surface of \lib/database/io/\ but hold no data and perform no actual persistence, effectively marking web support as deprecated. The \CLAUDE.md\ documentation explicitly instructs developers not to extend these files and to edit the \io/\ versions instead, as conditional imports in \lib/database/models.dart\ route to \io/\ or \html/\ at compile time.

lib/database/html · high confidence

iOS bundle identifier updated and CocoaPods config included

The iOS application's bundle identifier has been changed from com.example.bluebubbles to com.example.bluebubbleMessages across all build configurations in the project file. Additionally, the Debug and Release xcconfig files now optionally include the generated CocoaPods configuration files, ensuring that dependencies managed by CocoaPods are correctly linked during the build process.

ios/Flutter · high confidence

Fixes

Improved sync reliability for messages and attachments

The sync helper logic for messages and attachments now includes retry mechanisms to handle transient failures during database operations. Specifically, the \syncMessages\ function attempts to match chats to messages up to three times if the initial attempt fails, ensuring that synced messages are correctly associated with their chats even if the database is temporarily busy or inconsistent. This change addresses issues where synced messages might otherwise appear without an associated chat context.

lib/helpers/backend/sync · high confidence

Refactored message rendering with dedicated wrapper and edit isolation

The message display logic in the conversation view has been restructured to improve performance and stability. A new \MessagePartWrapper\ component now handles the composition of message content, stickers, and reactions, ensuring that visual overlays are correctly positioned relative to the bubble. Additionally, the edit functionality has been isolated into a separate \\_MessageContentBubble\ widget, which prevents unnecessary rebuilds of the entire message structure when the user is editing a specific part of a message.

_lib/app/layouts/conversation\view/widgets/message/parts · high confidence

Test coverage

Removed default widget smoke test

The default Flutter widget smoke test in \test/widget\_test.dart\ has been removed. This test previously verified that the app's counter increments correctly when the '+' icon is tapped, and its removal indicates that this specific automated verification is no longer part of the test suite.

test · high confidence

Dependencies

Android build infrastructure upgraded to AGP 8 and modern Gradle conventions

The Android build system has been modernized to use the Android Gradle Plugin 8.11.1 and Kotlin 2.2.20, replacing the legacy \apply plugin\ syntax with the plugins block and adopting the \namespace\ declaration. This upgrade raises the minimum supported Android version to API 26 and the target to API 35, while introducing support for Java 21 and specific build flavors (e.g., \prod\, \alpha\, \beta\) to streamline release management. Additionally, the iOS project now includes a standard \Podfile\ to manage CocoaPods dependencies, and the Dart dependencies have been updated to support the Flutter 3.12+ SDK.

(dependencies) · high confidence

Update Gradle wrapper to version 8.14

The Android Gradle wrapper has been upgraded from version 5.6.2 to 8.14. This change also introduces network timeout and distribution URL validation settings to improve build reliability and security.

android/gradle · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Baseline

  • First survey — no prior run to compare against. CAI 58.

Lenses

  • Code Health 74
  • Architecture 96
  • Maturity 67
  • Readiness 48
  • Security 76
  • Domain Modelling 74
  • Accessibility 60

Changes since last survey

  • 300 commits — 145 feature/other, 155 fixes

By area

  • lib/app — 106 commits
  • (repo) — 87 commits
  • (root) — 26 commits
  • lib/services — 25 commits
  • lib/helpers — 11 commits
  • .github/workflows — 9 commits
  • android/app — 7 commits
  • lib/database — 7 commits
  • snap/snapcraft.yaml — 5 commits
  • windows/build.ps1 — 3 commits
  • flatpak/app.bluebubbles.BlueBubbles.metainfo.xml — 2 commits
  • lib/main.dart — 2 commits
  • scripts/CLAUDE.md — 2 commits
  • .github/actions — 1 commit
  • docs/MESSAGE_RECEIVE_FLOW.md — 1 commit
  • docs/models.md — 1 commit
  • linux/CMakeLists.txt — 1 commit
  • linux/build.sh — 1 commit
  • linux/flutter — 1 commit
  • scripts/bump_desktop_versions.dart — 1 commit

Notable commits

  • fix: Differentiate sideloaded msix from store msix, and fix notifications not activating the correct app if multiple are installed
  • fix: Fix #2937
  • fix: Fix #3111
  • fix: Fix #3130 for real
  • fix: Fix alignment of tall attachments
  • fix: Fix analyze
  • fix: Fix dialog colors ios skin
  • fix: Fix linux notif clearing
  • fix: Fix navigation issues in tablet mode
  • fix: Fix page dimming by switching to MaterialPage
  • fix: Fix publisher order
  • fix: Fix unselected settings page background color
  • fix: Fix voice messages on Linux Snap
  • fix: Merge branch 'master' of github.com:BlueBubblesApp/bluebubbles-app into zach/fix/various-fixes-for-stable
  • fix: Merge branch 'master' of github.com:BlueBubblesApp/bluebubbles-app into zach/fix/various-fixes-for-stable
  • fix: Merge branch 'zach/fix/no-video-preview' of github.com:BlueBubblesApp/bluebubbles-app into development
  • fix: Merge branch 'zach/fix/orientation-swap-image-processing' of github.com:BlueBubblesApp/bluebubbles-app into development
  • fix: Merge branch 'zach/fix/redacted-mode-chat-subtitle' of github.com:BlueBubblesApp/bluebubbles-app into development
  • fix: Merge branch 'zach/fix/various-messages-view-tweaks' of github.com:BlueBubblesApp/bluebubbles-app into claude/url-preview-metadata-audit-eg17w7
  • fix: Merge pull request #3048 from richardtru/richardtru/bug/android-startup-crash-recovery
  • …and 280 more

Architecture

  • 0 containers · 1 bounded contexts · 0 dependency edges (baseline)

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

BlueBubblesApp/bluebubbles-app was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 19 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit e2eaced6e61eee746757a070475197bf23b671ad — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-13a154b7f5d1.