flyerhq/flutter_chat_ui
61.8
Adequate · 23 September 2026
10.7k
lines of production code
Dart
primary language
5
measurements over time
What this system is
Flyer Chat is a Flutter library that provides a customizable, cross-platform chat user interface with a modular, monorepo architecture. It manages message state through a core controller and supports a wide variety of message types, including text, images, files, video, audio, and streaming content. The system handles essential chat features such as real-time WebSocket communication, local persistence, image caching, and two-sided pagination for loading message history.
How it got here
2020–2024 — v2 architecture and monorepo migration
29 changes.
The project underwent a major structural overhaul, rebranding to Flyer Chat and migrating to a monorepo workspace with Flutter 3.32+. This period focused on rebuilding the core architecture with a new chat controller, immutable theming system, and comprehensive message model hierarchy. It also introduced a suite of specialized packages for handling specific message types, caching, and UI components, alongside a robust example application demonstrating these new capabilities.
2025 — streaming text and link preview features
4 changes.
This period focused on introducing new packages for real-time text streaming and link previews within the chat application. The work included implementing a widget for incremental text display with animation and markdown support, as well as a link previewer capable of handling internationalized domain names. Additionally, documentation rules for the Cursor AI assistant were added to guide development within the monorepo structure.
Features
Add file and system message widget packages
New packages are introduced to support specific message types in the chat interface: \flyer\_chat\_file\_message\ provides a widget for displaying file messages, and \flyer\_chat\_system\_message\ provides a widget for system messages. These additions allow users to render these distinct message categories within their chat applications.
_packages/flyer\_chat\_file\_message/lib, packages/flyer\_chat\_system\message/lib · high confidence
Add file message display widget
Introduces the FlyerChatFileMessage widget, which renders file attachments by displaying the file name, size, and an icon. The widget supports customization for sent versus received messages (including distinct background colors and text styles), allows toggling the visibility of timestamps and status indicators, and enables placing a custom widget above the message bubble.
_packages/flyer\_chat\_file\_message/lib/src, packages/flyer\_chat\_system\message/lib/src · high confidence
Add flyer\_chat Flutter example project
The flyer\_chat example application has been added to the repository, providing a complete, runnable Flutter project that demonstrates the chat library's capabilities. This includes the full native platform configurations for Android (Kotlin, Gradle, Manifest), iOS (Swift, Xcode project, Storyboards), and Linux (CMake), along with integration tests for the chat list widget to verify message insertion and list operations.
examples · high confidence
Add stub entry points for new message type packages
New Flutter packages for audio, custom, location, and video chat messages have been added to the repository. These packages currently contain only empty source files and minimal export stubs, serving as placeholders for future implementation of these specific message types within the chat application.
(repo-wide) · high confidence
Added Cursor AI coding rules for Flyer Chat architecture and features
New documentation rules have been added to the \.cursor/rules\ directory to guide the AI coding assistant. These rules cover the project's Melos monorepo structure, the responsibilities of the \ChatController\, customization options via theming and builders, core data models, architectural decisions, and the implementation details of the new streaming text message feature.
.cursor · high confidence
Flutter Chat UI package initialization and public API definition
The \flutter\_chat\_ui\ package is introduced with a main entry point that exports the core chat components, including the main \Chat\ widget, message rendering (\ChatMessage\, \SimpleTextMessage\), and UI utilities like \LoadMore\ and \ScrollToBottom\. The public API exposes specific features such as avatar support, username display, empty list handling, and typing indicators, while also exporting internal utilities like \ChatInputHeightNotifier\ (renamed to \ComposerHeightNotifier\) and type definitions, establishing the foundational structure for the chat interface.
_packages/flutter\_chat\ui/lib · high confidence
Introduce Flyer Chat Text Stream Message package
The new \flyer\_chat\_text\_stream\_message\ package is now available, providing a widget for displaying streamed text messages. This release exposes the main message widget along with supporting types for stream state and text segments, enabling users to integrate real-time text streaming into their chat interfaces.
_packages/flyer\_chat\_text\_stream\message/lib · high confidence
Introduce link preview widget with international domain support
The flutter\_link\_previewer package is now available, providing a LinkPreview widget that fetches and displays metadata (title, description, image) from URLs. This implementation supports internationalized domain names (IDN) by automatically converting non-ASCII characters to punycode, ensuring correct fetching of preview data for non-Latin domains. The widget allows customization of layout, styling, and animation, and integrates with the chat core for displaying link previews in chat messages.
_packages/flutter\_link\previewer/lib · high confidence
Introduce streaming text message widget with animated and markdown rendering modes
Adds a new \FlyerChatTextStreamMessage\ widget that displays text messages as they are streamed incrementally. The widget supports two rendering modes: \animatedOpacity\, which fades in each new chunk of text for a dynamic visual effect, and \instantMarkdown\, which renders the full accumulated text with Markdown support on each update to ensure consistency with final messages. It includes built-in support for loading states (with customizable shimmer animations or custom builders), message timestamps, and status indicators (sent, delivered, seen). The implementation relies on external \StreamState\ management to track loading, streaming, completed, and error states, and provides callbacks for handling link taps within the streamed content.
_packages/flyer\_chat\_text\_stream\message/lib/src · high confidence
Introduces platform-specific cache implementations for web and mobile/desktop
The cache module now provides concrete storage backends for different platforms. On web (HTML), data is stored in IndexedDB via the \idb\_shim\ package, while on mobile and desktop (IO), cached data is persisted as SHA256-hashed files in the application's cache directory using \path\_provider\. A common \BaseCache\ interface defines the operations (set, get, contains, delete, updateKey, dispose), and a default \Cache\ class throws \UnimplementedError\ for unsupported platforms, ensuring type-safe cross-platform caching.
_packages/cross\cache/lib/src/cache · high confidence
Introduction of Flutter Chat Core package
A new \flutter\_chat\_core\ package has been introduced to provide the foundational functionality for the \flutter\_chat\_ui\ package. This core library exposes essential components including the chat controller (with in-memory implementation and mixins for scrolling and upload progress), data models for messages and users, theming extensions, and utility functions for link previews and emoji detection.
_packages/flutter\_chat\_core/lib, packages/flyer\_chat\_text\message/lib · high confidence
New API integration layer for the Flyer Chat example
The Flyer Chat example now includes a dedicated API layer in \lib/api\ to handle real-time communication and data persistence. This adds a WebSocket service (\ChatWebSocketService\) that manages connection status, auto-reconnects with exponential backoff, and dispatches events for new messages, deletions, and flushes. It also introduces an \ApiService\ for REST operations like sending, deleting, and marking messages as seen, alongside a file upload utility (\upload\_file.dart\) that tracks upload progress via the chat controller. The main \Api\ widget now wires these services together, using a local \ConnectionStatus\ indicator to reflect WebSocket state and handling message lifecycle through the \InMemoryChatController\.
_examples/flyer\chat/lib/api · high confidence
New chat controller interface and in-memory implementation with upload and scroll support
The chat core package now exposes a new \ChatController\ abstract interface and an \InMemoryChatController\ implementation for managing message state. This change introduces a structured \ChatOperation\ stream to notify listeners of message insertions, updates, removals, and list replacements, ensuring UI components stay in sync. The in-memory controller includes built-in validation to prevent duplicate message IDs, which helps maintain correct rendering and animations. Additionally, it integrates two mixins: \UploadProgressMixin\ for tracking file/image upload progress via streams, and \ScrollToMessageMixin\ for programmatic scrolling to specific messages or indices, enhancing the developer experience for building chat interfaces.
_packages/flutter\_chat\_core/lib/src/chat\controller · high confidence
New chat example applications and components
The Flyer Chat example app now includes several new demonstration pages: a basic chat, a local chat with typing indicators and file/image support, and two pagination examples (loading older and newer messages). It also features a Gemini AI integration example with streaming text support, a Hive-based chat controller for local persistence, and a reusable composer action bar widget.
_examples/flyer\chat/lib · high confidence
New chat model architecture with comprehensive UI builder support
The chat core models have been completely redesigned to support a richer set of message types and granular UI customization. The new \Message\ sealed class hierarchy introduces dedicated types for text, streaming text, images, files, video, audio, system, and custom messages, each carrying detailed metadata such as reactions, pinning status, and precise delivery timestamps (created, sent, delivered, seen, edited). A new \Builders\ configuration class exposes specific builder callbacks for every message type and UI component (composer, chat list, scroll-to-bottom, load-more, empty state, and link previews), allowing developers to fully customize the appearance of each element. The models also introduce \MessageGroupStatus\ to indicate a message's position within a conversation group and \LinkPreviewData\ to handle rich link previews with image metadata.
_packages/flutter\_chat\core/lib/src/models · high confidence
New cross-cache and image message packages introduced
Two new packages have been added to the codebase: 'cross\_cache' provides a caching mechanism for images and files, and 'flyer\_chat\_image\_message' provides a widget for displaying image messages along with utilities for retrieving image dimensions. These additions enable developers to integrate image caching and specific chat message UI components into their applications.
_packages/cross\_cache/lib, packages/flyer\_chat\_image\message/lib · high confidence
New image caching and network image provider
The package now includes a \CachedNetworkImage\ class that acts as an \ImageProvider\ for Flutter, integrating with the \CrossCache\ utility to download, cache, and display images from URLs. This allows applications to load network images with built-in caching support and download progress reporting, leveraging the platform-specific storage mechanisms provided by \CrossCache\.
_packages/cross\cache/lib/src · high confidence
New image message widget with placeholder and upload support
The \flyer\_chat\_image\_message\ package now includes a new \FlyerChatImageMessage\ widget that renders image messages with support for BlurHash and ThumbHash placeholders, upload progress indicators, and optional HTTP headers for authenticated requests. It also allows custom image providers, error builders, and displays message timestamps and status indicators.
_packages/flyer\_chat\_image\message/lib/src · high confidence
New text message widget with customizable styling and link handling
Introduces the FlyerChatTextMessage widget for displaying text messages, supporting markdown rendering via GptMarkdown. Users can now customize message appearance with specific background and text styles for sent versus received messages, and control link presentation through dedicated properties for link color, decoration, and decoration color. The widget also provides options to display timestamps and message status indicators, handle link taps via a callback, and position link previews relative to the message content.
_packages/flyer\_chat\_text\message/lib/src · high confidence
New utility types, status icons, and user caching for chat rendering
This change introduces several foundational utilities for the chat core: a \UserCache\ class with LRU eviction and \ChangeNotifier\ support to prevent avatar flickering in recycled list items; a \getIconForStatus\ helper that maps \MessageStatus\ values (sent, delivered, seen, error, sending) to specific Material icons; a new \isOnlyEmoji\ function to detect emoji-only text; and new typedefs (\MessageID\, \UserID\) and enums (\MessageStatus\, \TimeAndStatusPosition\, \MessagesGroupingMode\) that define message grouping modes and status positioning. These utilities enable more robust message grouping, clearer status indicators, and smoother UI performance when resolving user data.
_packages/flutter\_chat\core/lib/src/utils · high confidence
Removals
Removal of legacy Calculator class from main library entry point
The main library entry point (lib/flutter\_chat\_ui.dart) has been deleted, removing the previously exported Calculator class and its addOne method. This cleanup eliminates unused or placeholder code from the public API surface, ensuring the library exports only relevant chat UI components.
lib · high confidence
Behavioural changes
Chat UI v2: New core widgets and theming system
The chat interface has been rebuilt for v2, introducing a new theming system via \ChatTheme\ and a suite of new UI components. The main \Chat\ widget now orchestrates the layout using \ChatAnimatedList\ and \Composer\, while new widgets include \Avatar\ and \Username\ for user identification, \SimpleTextMessage\ for message bubbles with support for link previews and emoji-only styling, and \IsTypingIndicator\ for real-time typing status. The \Composer\ widget has been enhanced with granular controls for send button visibility (\SendButtonVisibilityMode\), empty message handling, and safe area management. Additional utility widgets like \EmptyChatList\, \LoadMore\, and \ScrollToBottom\ provide a complete out-of-the-box experience, all relying on the new \UserCache\ and \CrossCache\ for efficient data and image handling.
_packages/flutter\_chat\ui/lib/src · high confidence
Enhanced message interaction callbacks and pagination support
The chat interface now provides more granular control over message interactions and data loading. Callbacks for tapping, double-tapping, long-pressing, and secondary-tapping messages have been updated to include the message index and relevant gesture details (such as \TapUpDetails\ or \LongPressStartDetails\), enabling more precise handling of user actions. Additionally, a new \PaginationCallback\ type has been introduced to support two-sided pagination, allowing the chat list to load both older and newer messages on demand. The composer also exposes new modes for controlling the send button visibility and input clearing behavior.
_packages/flutter\_chat\ui/lib/src/utils · high confidence
Introduces ChatAnimatedList with refined pagination and scroll anchoring
The chat list component has been replaced by a new \ChatAnimatedList\ (and its \ChatAnimatedListReversed\ convenience wrapper) that manages message animations, keyboard handling, and pagination. A key behavioral change is the default pagination threshold for non-reversed lists, which is now set to 0.01 (1%) to ensure scroll anchoring correctly identifies the topmost visible item before loading older messages, preventing list jumps. The reversed list defaults to a 0.2 threshold for older messages and 0.99 for newer messages, with specific logic to block scroll-to-end during newer message loading. The component also exposes \cacheExtent\ to prevent scrollbar thumb jumps for tall messages and uses \scrollview\_observer\ for robust pagination detection.
_packages/flutter\_chat\_ui/lib/src/chat\_animated\list · high confidence
Introduction of message grouping and expanded gesture callbacks in chat messages
The chat message widget now supports grouping consecutive messages from the same sender based on time proximity, visually connecting them and adjusting padding. Additionally, tap, long-press, double-tap, and secondary-tap callbacks now receive the message index, a BuildContext, and TapUpDetails, enabling more precise interaction handling within the message list.
_packages/flutter\_chat\_ui/lib/src/chat\message · high confidence
New immutable theming system with light/dark modes and easy customization
The chat UI now uses a new, immutable theming system built with Freezed, allowing users to easily customize the appearance of the chat interface. This system includes \ChatTheme\, \ChatColors\, and \ChatTypography\ classes, providing default light and dark themes that can be merged or customized. Users can now easily switch between light and dark modes or apply custom color schemes using the new \withLightColors\ and \withDarkColors\ extension methods on \ChatTheme\.
_packages/flutter\_chat\core/lib/src/theme · high confidence
Project rebranding to Flyer Chat and license change to Apache 2.0
The project has been rebranded from 'Flutter Chat UI' to 'Flyer Chat', with the README updated to reflect the new name, branding, and documentation links. The software license has been changed from MIT to Apache License 2.0, and a new Code of Conduct has been added to establish community standards.
(repo-wide) · high confidence
Test coverage
Added test infrastructure for InMemoryChatController; Added tests for the isOnlyEmoji utility function; Added unit tests for CrossCache functionality; Added unit tests for LinkPreviewData and Message models; Removed obsolete calculator unit test.
Dependencies
Migrate to Flutter 3.32+ and Dart 3.8+ with workspace-based dependency management
The project has been upgraded to require Flutter 3.32.0 and Dart 3.8.0, replacing the previous minimums of Flutter 1.17 and Dart 2.7. This change introduces a monorepo workspace structure managed by Melos, consolidating the example app and multiple packages (flutter\_chat\_ui, flutter\_chat\_core, cross\_cache, link\_previewer, and various message types) under a single root. The example app's Android build configuration has been updated to use the new Flutter Gradle Plugin with Java 17, and iOS/macOS platforms now target iOS 13+ and macOS 10.15+. Additionally, the codebase now depends on the \material\_ui\ package (version 1.1.0) and has updated several core dependencies, including \dio\ to 5.9.0, \provider\ to 6.1.5+1, and \intl\ to 0.20.2.
(dependencies) · 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
Score
- CAI 56 → 62 (+6.3)
- Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 98 → 88 (-10.2)
- Architecture 100 → 98 (-2.3)
- Maturity 62 → 62 (+0.3)
- Readiness 26 → 43 (+16.9)
- Security 100 → 100 (+0.0)
- Domain Modelling 100 → 100 (+0.0)
Resolved (7)
- Coverage not included — suite not readable by the collector
- Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
- Further orphaned files (smaller)
- No exposed public API
- Off-boarding risk: anonymized user #1
- Test reliability not included
- complexity unreadable for .dart, .swift — churn × complexity hotspots could not be measured
New (47)
- ChatMessage.build (cognitive 16) (packages/flutter_chat_ui/lib/src/chat_message/chat_message.dart)
- ClassTooLong: _ChatAnimatedListState (packages/flutter_chat_ui/lib/src/chat_animated_list/chat_animated_list.dart)
- CrossCache.downloadAndSave (cognitive 17) (packages/cross_cache/lib/src/cross_cache.dart)
- Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
- Documentation: no installation or build instructions (README.md)
- Duplicated block (11 lines × 2) (examples/flyer_chat/lib/main.dart)
- Duplicated block (13 lines × 3) (packages/flutter_chat_ui/lib/src/simple_text_message.dart)
- Duplicated block (13–14 lines × 2) (examples/flyer_chat/lib/main.dart)
- Duplicated block (16–19 lines × 5) (packages/flutter_chat_ui/lib/src/simple_text_message.dart)
- Duplicated block (18 lines × 2) (packages/flutter_chat_ui/lib/src/chat_animated_list/chat_animated_list.dart)
- Duplicated block (19 lines × 2) (packages/flutter_chat_ui/lib/src/chat_animated_list/chat_animated_list.dart)
- Duplicated block (20 lines × 3) (packages/flutter_chat_ui/lib/src/simple_text_message.dart)
- Duplicated block (25 lines × 4) (packages/flutter_chat_ui/lib/src/simple_text_message.dart)
- Duplicated block (39 lines × 2) (packages/flutter_chat_ui/lib/src/simple_text_message.dart)
- Duplicated block (5 lines × 2) (examples/flyer_chat/lib/gemini.dart)
- Duplicated block (50 lines × 2) (packages/flutter_chat_ui/lib/src/simple_text_message.dart)
- Duplicated block (6 lines × 3) (packages/cross_cache/lib/src/cache/io.dart)
- Duplicated block (6 lines × 3) (packages/flutter_chat_ui/lib/src/simple_text_message.dart)
- Duplicated block (7 lines × 3) (examples/flyer_chat/lib/gemini.dart)
- Duplicated block (7 lines × 3) (packages/flutter_chat_ui/lib/src/simple_text_message.dart)
- …and 27 more
Changes since last survey
- 2 commits — 2 feature/other, 0 fixes
By area
- examples/flyer_chat — 1 commit
- packages/cross_cache — 1 commit
Notable commits
- change: chore(release): publish packages
- change: refactor: replace flutter material imports with material_ui and update package dependencies (#893)
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
flyerhq/flutter_chat_ui 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 23 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 9bee5df245bbff362ec4916d007945a64d9a4b2f — 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-955b9cee9818.