exyte/Chat
58.7
Adequate · 1 October 2026
14.1k
lines of production code
Swift
primary language
2
measurements over time
What this system is
This system is a SwiftUI-based chat library that provides a customizable interface for sending and receiving messages, including text, media, documents, and live location sharing. It supports rich interactions such as emoji reactions, threaded replies, audio recording with waveform visualization, and link previews. The package also includes example applications demonstrating integration with Firebase Firestore for real-time data synchronization and user authentication.
How it got here
2022–2023 — Swift Package migration and Firestore example
16 changes.
The project migrated to Chat SDK version 3 with breaking API changes and established a Swift Package Manager distribution structure. A comprehensive Firestore-backed example application was added, featuring full authentication, group chat creation, and real-time message synchronization. The core library was enhanced with richer message models, auto-theming, and link preview support, accompanied by expanded test coverage.
2025–2026 — Rich media and interaction enhancements
14 changes.
The project expanded its chat capabilities by introducing support for diverse attachment types, including documents, static and live locations, and audio recordings with waveform visualization. Significant UI overhauls enriched the message experience with link previews, grouped reactions, avatars, and detailed upload status tracking. The example application was restructured to demonstrate these new features, including theme cycling and complex interaction modes like threaded comments and group chat broadcasting.
Features
Add ChatFirestoreExample Xcode project configuration
The ChatFirestoreExample iOS application project is now included in the repository, providing a complete Xcode workspace for building and running the example. The project configuration defines the build structure, including source files for authentication, conversations, users, and chat views, as well as managers for sessions and data storage. It links against the ExyteChat framework and Firebase libraries (Firestore and Storage) to enable real-time chat functionality backed by Firestore.
ChatFirestoreExample/ChatFirestoreExample.xcodeproj · high confidence
Add ChatFirestoreExample iOS app with Firebase integration and orientation locking
The ChatFirestoreExample iOS application has been added, providing a SwiftUI-based chat demo that integrates with Firebase. The app initializes Firebase via an AppDelegate, manages user authentication state to switch between login and conversation views, and includes logic to lock the camera interface to portrait orientation while allowing general app rotation. Configuration files for Firebase (GoogleService-Info.plist) and app metadata (Info.plist) are included to support the example.
ChatFirestoreExample/ChatFirestoreExample · high confidence
Add group chat creation flow to the Firestore example
The Firestore example now includes a complete UI and logic for creating group conversations. Users can navigate to a 'New Message' screen, select 'Create Group', choose multiple users from a searchable list, set a group name, and upload a group avatar. The implementation adds \UsersView\, \GroupSelectUsersView\, and \GroupCreateView\ for the UI, along with \UsersViewModel\ to handle user selection, search filtering, and the asynchronous creation of the group conversation document in Firestore with the associated metadata.
ChatFirestoreExample/ChatFirestoreExample/Users · high confidence
Add utility helpers and network monitoring for the Firestore chat example
The ChatFirestoreExample now includes a new Utils module containing a NetworkMonitor that observes connectivity status, helper extensions for formatting dates as relative time strings (e.g., "2 hours ago"), a custom font modifier, and a keyboard-dismissal utility. These additions support the example app's UI and data handling without changing the core chat library behavior.
ChatFirestoreExample/ChatFirestoreExample/Utils · high confidence
Adds custom UI components for the Firestore chat example
The Firestore chat example now includes dedicated SwiftUI views for common interface elements: an activity indicator for loading states, an avatar view that supports cached image loading with custom keys, a styled blue button, a custom text field with focus-based border styling, and a search field with a clear button. These components provide a consistent visual style and specific functionality (like image caching and focus handling) within the example app.
ChatFirestoreExample/ChatFirestoreExample/Views · high confidence
Introduce Firestore-backed chat example with unread counters and reply support
The ChatFirestoreExample now includes a complete Conversation module that persists chat history to Cloud Firestore, enabling real-time message synchronization, reply threading, and per-user unread message counters. The UI displays conversation metadata (avatars, titles) and handles orientation locking, while the ViewModel manages Firestore subscriptions, message sending with optimistic updates, and unread state management.
ChatFirestoreExample/ChatFirestoreExample/Conversation · high confidence
Introduce audio recording and playback with waveform visualization
Users can now record audio messages directly within the chat interface and play them back with a visual waveform indicator. This change adds the recording UI components (RecordIndicator, RecordWaveform), the audio capture logic (Recorder), and the playback engine (RecordingPlayer). The waveform view dynamically adjusts to the chat width and supports scrubbing to seek within the audio. The audio session is configured for voice chat mode to ensure proper handling on mobile devices.
Sources/ExyteChat/Views/Recording · high confidence
Introduce chat list view with offline detection and unread counters
The ConversationsView and its ViewModel have been added to the ChatFirestoreExample to display a list of chat conversations. This view now includes a network monitor that shows a 'Waiting for network' warning when connectivity is lost, displays unread message counts on conversation items, and supports searching through the conversation list. It also integrates with the data storage to subscribe to real-time updates and load fake conversations for demonstration purposes.
ChatFirestoreExample/ChatFirestoreExample/Conversations · high confidence
Introduces Firestore-backed chat example with media and session management
The ChatFirestoreExample app now includes core managers for handling user sessions, data storage via Firestore, and media uploading to Firebase Storage. DataStorageManager handles real-time synchronization of users and conversations, including support for voice recordings in conversation previews. FakeConversationsManager provides sample data (users Bob, Steve, Tim) to help users explore the chat interface immediately. SessionManager persists user identity using UserDefaults, and UploadingManager enables uploading images, videos, and audio recordings to Firebase Storage, supporting the chat's media capabilities.
ChatFirestoreExample/ChatFirestoreExample/Managers · high confidence
New attachment types and upload status tracking
The chat interface now supports Document and Location attachments, with dedicated UI components for displaying and handling them. Additionally, users can now see real-time upload progress, cancellation, and error states for media attachments via new overlay views and status capsules, and the system photo picker has been integrated to allow selecting files from the device library.
Sources/ExyteChat/Views/Attachments · high confidence
New auto-theming modifiers and system message support
Users can now automatically theme the chat view using the new \chatTheme(accentColor:)\ modifier or the iOS 18+ specific \chatTheme(themeColor:background:improveContrast:)\ modifier, which intelligently adjusts colors and contrast for readability. The theme system now distinguishes between current, other, and system message types, allowing for distinct styling of system messages. Additionally, the library has migrated to native SwiftUI environment values for iOS 6+ and updated default icons to use SF Symbols for better light/dark mode tinting.
Sources/ExyteChat/Theme · high confidence
New location sharing, live read indicators, and enhanced chat customization
Users can now share static or live location within messages, with live location broadcasting updates in real-time and a dedicated fullscreen map view for monitoring. A new 'New messages' divider (last read indicator) can be enabled to visually separate read from unread content. The chat interface offers deeper customization, including configurable keyboard dismiss modes, auto-focus for the text input on open, and the ability to choose between the native system photo picker or the built-in media picker. Additionally, users can now share multiple attachments simultaneously via the system share sheet.
Sources/ExyteChat/Views · high confidence
New user registration flow with avatar upload in the Firestore example app
The ChatFirestoreExample app now includes a dedicated authentication interface allowing users to create a test account by entering a nickname and selecting a profile photo. The new AuthView presents a form with a media picker for avatar selection, while the AuthViewModel handles the logic to check for existing users via Firestore or create a new user record, including uploading the selected avatar image to storage.
ChatFirestoreExample/ChatFirestoreExample/Auth · high confidence
New utility components for image caching, attachment sharing, and zoomable content
The chat utility layer now includes several new components to enhance media handling and user interaction. CachedAnimatedImage and CachedAsyncImage provide robust, Kingfisher-backed asynchronous image loading with support for local file URLs (fixing GIF display issues) and custom cache keys. ShareSheet and AttachmentSharing enable users to share local and remote attachments via the system share sheet, handling necessary downloads and file conversions. ZoomableContainer adds double-tap-to-zoom functionality for media previews. Additional utilities like AsyncMap, CustomFocus, FrameGetter, NetworkMonitor, and SafeAreaInsets support these features and general layout/focus management.
Sources/ExyteChat/Utils · high confidence
New utility extensions and link preview support
This update adds a suite of helper extensions to the chat library, including safe collection access, hex color parsing, and dynamic type sizing for emoji bubbles. It introduces an EmojiTextField for emoji-only input and a drag-gesture modifier for custom swipe actions. Most notably, it implements a caching system and pill-style view for link previews, ensuring metadata persists during scrolling and fits within message bubbles without layout cycles.
Sources/ExyteChat/Extensions · high confidence
Behavioural changes
Added Xcode workspace and scheme configuration for the Swift Package
The project now includes the necessary Xcode workspace and scheme files to support local development and testing of the Swift Package Manager structure. This allows developers to open the package in Xcode, run the ExyteChat target, and execute the ExyteChatTests suite directly from the IDE.
.swiftpm · high confidence
Chat example app restructured with theme cycling and new attachment support
The ChatExample app has been reorganized to include a new 'Active chat example' alongside the existing 'Simple chat example', allowing users to toggle between different chat theme styles (accent, image-based, and iOS 18 themed) via a toolbar button. This update also introduces support for attaching documents and locations to chat messages, enabled by the addition of NSLocationWhenInUseUsageDescription in the Info.plist. The project structure now includes an ExampleThemeState enum to manage these theme iterations and applies specific color themes to the media picker and comment examples.
ChatExample/ChatExample · high confidence
Expanded message model with reactions, live location, and document support
The chat model now supports richer message content and interaction. Messages can include emoji reactions with their own status tracking, and the message body uses AttributedString to support formatted text. New attachment types allow sending documents (with file name and size) and live location sharing (with duration presets and broadcast events). The system also introduces a new 'system' user type to highlight system messages, adds a 'delivered' status to the message lifecycle, and provides detailed position enums (e.g., first/middle/last in group or section) to improve layout and animation behavior for grouped messages.
Sources/ExyteChat/Model · high confidence
InputView refactored with new attachment types and audio recording modes
The InputView has been split into focused extensions to support new attachment types (documents, static location, live location) and configurable audio recording behaviors (hold-to-record vs. tap-to-toggle). Users can now attach documents and share either a fixed or live location alongside media and GIFs. The audio recording interface adapts to the selected mode: hold-to-record shows a lock button to switch to hands-free, while tap-to-toggle replaces the microphone with a simple start/stop button. Attachment previews for media, documents, and locations are now displayed above the input bar with removal controls, and the attach menu dynamically adjusts its items based on available input types.
Sources/ExyteChat/Views/InputView · high confidence
Migration to Chat SDK version 3 with breaking API changes
The chat framework has been upgraded to version 3, introducing several breaking changes for existing users. The \enableLoadMore\ modifier now uses an \offset\ parameter instead of \pageSize\, and its closure no longer accepts arguments. Link preview configuration has been inverted, with \linkPreviewsDisabled\ replaced by \linkPreviewsEnabled\ and \shouldShowLinkPreview\ renamed to \shouldShowPreviewForLink\. Markdown styling is now applied by default, removing the need for \messageUseMarkdown\ and \messageUseStyler\; users should now pass \AttributedString\ directly to the \Message\ initializer for custom attributes. Additionally, the \messageBuilder\ and \inputViewBuilder\ closures have been refactored to receive single struct parameters (\MessageBuilderParameters\ and \InputViewBuilderParameters\) instead of multiple individual arguments.
(repo-wide) · high confidence
Redesigned message layout with link previews, reactions, and avatars
The message view has been rebuilt to support richer content presentation. Users now see link previews within messages (controlled by a configurable limit and per-URL visibility), grouped emoji reactions with overflow handling, and optional user avatars and usernames. The layout dynamically adjusts the time indicator's position (horizontal, vertical, or overlay) based on message length and attachment presence, and status indicators now distinguish between sending, sent, delivered, and read states.
Sources/ExyteChat/Views/MessageView · high confidence
Redesigned message menu with reaction overview and configurable actions
The message context menu has been restructured to include a horizontal reaction overview that displays users who have reacted to a message, alongside a new reaction selection interface that supports emoji search and custom reaction types. The menu actions are now driven by a configurable protocol, providing default options like Copy, Reply, Edit, and Share (conditionally shown if attachments are present), with specific icon updates for iOS 18 and fallbacks for earlier versions.
Sources/ExyteChat/Views/MessageView/MessageMenu · high confidence
Refactored chat example screens with new active chat and comments modes
The chat example application has been reorganized to separate distinct usage patterns into dedicated screens. A new ActiveChatExampleView demonstrates group chat capabilities with live location broadcasting and interactive keyboard dismissal, while the main ChatExampleView now supports a broader set of input types including documents, static and live locations, and Giphy, along with features like last-read indicators and swipe-to-reply actions. Additionally, a new CommentsExampleView illustrates a threaded comment interface with custom message builders and specific menu actions like printing message text. These changes update the example project to reflect the latest SDK capabilities for complex chat scenarios.
ChatExample/ChatExample/Screens · high confidence
Reorganized ChatExample project structure and updated for Swift 6
The ChatExample Xcode project has been restructured to align with Swift 6 requirements and improved organization. The project now includes specific view files for an 'ActiveChat' example alongside the existing chat views, and utility extensions for date formatting, color handling, and async mapping have been consolidated. The project configuration also adds an .editorconfig for consistent 4-space formatting and updates the framework references to ensure proper linking of the ExyteChat library.
ChatExample/ChatExample.xcodeproj · high confidence
Replaced hardcoded mock data with dynamic generation utilities
The ChatExample's data generation layer has been refactored to replace static, hardcoded content with dynamic, randomized data. New utility classes (Lorem, MockChatData, MockChatInteractor) now generate random messages, attachments, and reactions on the fly, including support for live location updates and varied message statuses. This change improves the realism of the example chat experience by simulating a more active and diverse conversation history.
ChatExample/ChatExample/DataGeneration · high confidence
Updated Xcode scheme for Swift 6 compatibility
The ChatExample project's Xcode scheme has been reorganized and updated to target Xcode 16.2, aligning with the migration to Swift 6. This change ensures the example app correctly builds and runs alongside its dependencies (ExyteChat, MediaPicker, FloatingButton) using the latest toolchain settings.
ChatExample/ChatExample.xcodeproj/xcshareddata · high confidence
Workspace configuration files added to ChatExample
The ChatExample project workspace now includes standard Xcode workspace configuration files: contents.xcworkspacedata to define the workspace structure, IDEWorkspaceChecks.plist to manage workspace integrity checks, and WorkspaceSettings.xcsettings with Previews disabled. These changes ensure consistent workspace behavior and disable SwiftUI previews for the example project.
ChatExample/ChatExample.xcodeproj/project.xcworkspace · high confidence
Fixes
Fix Giphy media crash and aspect ratio display
Resolves a crash that occurred when adding Giphy media by ensuring the SDK's \gifByID\ callback updates the UI on the main thread, and corrects the display of Giphy media to use the proper aspect ratio provided by the SDK response.
Sources/ExyteChat/Views/Giphy · high confidence
Test coverage
Added unit tests for chat message grouping, ordering, and link metadata caching
Added new test coverage for the ExyteChat library, including tests for the LinkMetadataCache to verify correct retrieval and storage of link preview data, and extensive tests for WrappingMessages to validate message sectioning by day, row ordering logic, and specific behaviors for answer and quote reply modes such as nested reply visibility and cross-day grouping.
Tests · high confidence
Dependencies
Initial release of ExyteChat Swift Package with MediaPicker, Giphy, Kingfisher, and AnchoredPopup dependencies
The project is now distributed as a Swift Package (ExyteChat) compatible with iOS 17 and Swift 5 language mode, introducing strict concurrency checking. The package integrates four external dependencies: Exyte MediaPicker (v3.4.4+), Giphy iOS SDK (v2.2.16 exact), Kingfisher (v8.5.0+), and AnchoredPopup (v1.1.3+), enabling media picking, GIF integration, image caching, and popup UI components within the chat library.
(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 66 → 59 (-7.5)
- Rubric changed (rubric-2026.09.11 → rubric-2026.09.18) — scores are not directly comparable.
Lenses
- Code Health 93 → 93 (+0.1)
- Architecture 99 → 93 (-5.9)
- Maturity 54 → 54 (-0.0)
- Readiness 55 → 41 (-13.5)
- Security 100 → 100 (+0.0)
Resolved (9)
- ClassTooLong: InputView (Sources/ExyteChat/Views/InputView/InputView.swift)
- Duplicated block (20 lines × 2) (Sources/ExyteChat/Views/InputView/InputView.swift)
- FileTooLong: InputView/InputView.swift (Sources/ExyteChat/Views/InputView/InputView.swift)
- Hotspot: Sources/ExyteChat/Views/InputView/InputView.swift (Sources/ExyteChat/Views/InputView/InputView.swift)
- Hotspot: Sources/ExyteChat/Views/MessageView/MessageMenu/MessageMenu.swift (Sources/ExyteChat/Views/MessageView/MessageMenu/MessageMenu.swift)
- Hotspot: Sources/ExyteChat/Views/UIList.swift (Sources/ExyteChat/Views/UIList.swift)
- InputView.dragGesture (cognitive 19) (Sources/ExyteChat/Views/InputView/InputView.swift)
- Off-boarding risk: anonymized user #1
- Repeated repair: Sources/ExyteChat/Views/Attachments/FullscreenMediaPages.swift (Sources/ExyteChat/Views/Attachments/FullscreenMediaPages.swift)
New (12)
- AttachmentCell.body (cognitive 16) (Sources/ExyteChat/Views/Attachments/AttachmentCell.swift)
- AttachmentCell.body (cyclomatic 16) (Sources/ExyteChat/Views/Attachments/AttachmentCell.swift)
- Coverage not measured — Swift suite
- Dependency hygiene PARTLY measured — SwiftPM pinning read, dependency currency NOT established
- Duplicated block (11 lines × 2) (ChatExample/ChatExample/Screens/ActiveChatExampleView.swift)
- Duplicated block (18 lines × 2) (Sources/ExyteChat/Views/InputView/InputView+AttachmentPreviews.swift)
- Hotspot: Sources/ExyteChat/Views/Attachments/AttachmentCell.swift (Sources/ExyteChat/Views/Attachments/AttachmentCell.swift)
- InputView.dragGesture (cognitive 19) (Sources/ExyteChat/Theme/ChatTheme.swift)
- InputView.viewOnTop (cognitive 16) (Sources/ExyteChat/Theme/ChatTheme.swift)
- Off-boarding risk: anonymized user #1
- Projects may be oversized for their cohesion
- Redundant initialization paths for text content. The Message type exposes two distinct initializers that differ only by accepting either a plain String or an AttributedString for the message body. This forces consumers to choose between two nearly identical signatures based on a minor data type difference, rather than having a single flexible initializer or a clear builder pattern.
Changes since last survey
- 18 commits — 8 feature/other, 10 fixes
By area
- Sources/ExyteChat — 14 commits
- (repo) — 4 commits
Notable commits
- fix: Fix Xcode 27 linker crash by co-locating ChatView's init with its @State properties
- fix: Fix attach menu position with keyboard
- fix: Fix removing photos selected through system picker
- fix: Fix theme not applied to some icons
- fix: Fix timestamp placement
- fix: Fix video preview for system picker
- fix: Merge pull request #297 from lissine0/back-arrow-color-fix
- fix: Merge pull request #302 from nezhyborets/macpaw-xcode27-init-fix
- fix: Merge pull request #303 from Shonchik/fix-location
- fix: Merge pull request #305 from lissine0/small-fix
- change: Apply theme to document attachments
- change: Divided location into staticLocation and liveLocation
- change: Don't resize the image of the menu button icon
- change: Make system photo picker remember the previous selection
- change: Render the back arrow image as a template
- change: Restore tick size
- change: Split InputView into multiple files
- change: Use the theme property of the back button image in attachments editor
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
exyte/Chat 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 1 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 49bf1f37606e60a44972fa72f2693b62236b7c57 — the exact code this score is about.
- Scored under rubric-2026.09.18 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-e569280dd5e2.