v14.0.0
Released: 2026-04-16 Β· Full diff Β· Migration guide
A full visual and architectural refresh of the SDK. This release brings a redesigned component system, new message composer, overhauled theming, and a cleaner customization model β alongside significant breaking changes to component APIs, CSS class names, and context wrappers.
β οΈ Breaking Changes
Resources for migrating:
- π Human-readable migration guide β step-by-step with code examples
- π€
ai-docs/breaking-changes.mdβ machine-readable summary of all breaking changes, intended for use with AI coding assistants (Copilot, Cursor, Claude, etc.)
π€ai-docs/ai-migration.md- Coding Agents-optimized migration plan.
Component & Import Renames
| v13 | v14 |
|---|---|
MessageInput |
MessageComposer |
MessageInputFlat |
MessageComposerUI |
MessageInputContext |
MessageComposerContext |
useMessageInputContext |
useMessageComposerContext |
MessageOptions |
MessageActions |
MessageDeleted |
MessageDeletedBubble |
MessageNotification |
NewMessageNotification |
ScrollToBottomButton |
ScrollToLatestMessageButton |
ReactionsListModal |
MessageReactionsDetail |
ChannelListMessenger |
ChannelListUI |
ChannelPreview |
ChannelListItem |
ChannelPreviewMessenger |
ChannelListItemUI |
ChannelSearch |
Search (now stable, main entrypoint) |
Modal |
GlobalModal |
UploadButton |
FileInput |
MessageIsThreadReplyInChannelButtonIndicator |
MessageAlsoSentInChannelIndicator |
MessageListNotifications |
NotificationList |
isOnlyEmojis |
messageTextHasEmojisOnly |
useAudioController |
useAudioPlayer |
Removed entirely (no replacement via rename): FixedHeightMessage, EditMessageForm, EditMessageModal, MessageActionsBox, MessageActionsWrapper, CustomMessageActionsList, QuotedPoll, ButtonWithSubmenu, ConnectionStatus, MessageErrorText, RemindMeActionButton. See the migration guide for recommended alternatives.
Removed icon exports: ActionsIcon, ReactionIcon, ThreadIcon, MessageErrorIcon, PauseIcon, PlayTriangleIcon, GeolocationIcon, CloseIcon, SendIcon, MicIcon. Migrate to the public Icons set or higher-level components such as MessageActions, SendButton, and MessageStatus.
MessageActions and Search are no longer exported from stream-chat-react/experimental. Import from the main package:
import { MessageActions, Search } from 'stream-chat-react';UI Overrides: Channel β WithComponents
Channelno longer accepts component override props. Move all overrides to<WithComponents overrides={{...}}>.ChannelListdirect override props removed:List,Preview,Avatar,LoadingIndicator,LoadingErrorIndicator. UseWithComponentsfor all of these.- The
with*ContextHOC wrappers have been removed:withChannelActionContext,withChannelStateContext,withChatContext,withComponentContext,withMessageContext,withTranslationContext,withTypingContext. Useuse*Contexthooks inside function components instead. Channelnow rendersEmptyStateIndicatorby default when no channel is active. PassEmptyPlaceholder={null}to restore the old blank behavior.ChannelList.additionalChannelSearchPropsand theChannelList.ChannelSearchoverride prop were removed. Customize search viaWithComponentswithSearch,SearchBar, orSearchResults.
Message, Actions & Notifications
handleDeletesignature changed from(event, options?)to(options?). It now rethrows server-side failures β wrap intry/catchin custom delete buttons.onlySenderCanEditremoved fromMessageProps. Editability follows channel capabilities; filtereditout of yourmessageActionSetfor custom restrictions.- Notification callback props removed from
Message:getDeleteMessageErrorNotification,getFetchReactionsErrorNotification,getFlagMessageErrorNotification,getMuteUserSuccessNotification, and others. Use notification translators inStreami18noruseNotificationApi(). customMessageActionsremoved fromMessageContext,Message,MessageList, andVirtualizedMessageList. UsemessageActionSetandMessageActions.- Own messages can no longer be marked unread, even when the channel has the
read-eventscapability. MessageEditedTimestampremoved. UseMessageEditedIndicator, or render your ownTimestampagainstmessage.message_text_updated_at.MessageTimestampnow defaults to time-only formatting (HH:mm). Override viaStreami18nor provide a customMessageTimestampfor the old calendar-style output.- Edit-message flow no longer uses
EditMessageForm/EditMessageModal. Start editing withmessageComposer.initState({ composition: message }), cancel withmessageComposer.clear(). MessagePropsno longer injectsendOfGroup,firstOfGroup, orgroupedByUseras props. Read them fromuseMessageContext()inside your custom component.- The order of actions in
MessageActionshas changed. Define your ownmessageActionSetexplicitly if your UX depends on a stable action order.
Message Composer (formerly MessageInput)
additionalMessageInputPropsβadditionalMessageComposerPropshandleSubmitnow accepts only an optional event. ThecustomMessageDataandSendMessageOptionsarguments were removed. Use composer middleware ormessageComposer.customDataManagerinstead.- The default textarea now grows up to 10 rows (was 1). Pass
maxRows={1}to restore single-line behavior. QuotedMessagePreviewHeaderremoved. Customize the full quoted preview throughQuotedMessagePrevieworQuotedMessagePreviewUI.- Voice recordings moved out of
AttachmentPreviewListinto a dedicatedVoiceRecordingPreviewSlot. - The
EmojiPickerplugin now requires a separate stylesheet import:import 'stream-chat-react/dist/css/emoji-picker.css';
str-chat__message-composer-containernow wraps the full message composer area.
Avatar, Gallery & Attachments
Avatarprops renamed:imageβimageUrl,nameβuserName. Theuserprop was removed.sizenow accepts arbitrary strings.ChannelAvatar/GroupAvatar: usedisplayMembersinstead ofgroupChannelDisplayInfo.GroupAvatarnow auto-caps displayed members at 4 (or 2 with an overflow badge) β callers no longer control slicing.AvatarStack: newcapLimitprop (default3) controls overflow. Previously callers managed slicing manually.AttachmentProps.GalleryβAttachmentProps.ModalGallery. The oldGallerycomponent is now a carousel provider; useModalGalleryfor the thumbnail-grid-plus-viewer behavior.ModalGallery: migrate from theimages/indexAPI to theitems-based API. Gallery payloads changed fromimagestoitemsof typeGalleryItem.FileIcon:filenameβfileName;big,size,sizeSmall,typeremoved;mimeTypeToIcon(type, mimeType)βmimeTypeToIcon(mimeType?).ReactionSelector: propsAvatar,detailedView,latest_reactions,reaction_counts,reaction_groups,reactionOptions, andreverseremoved.BaseImagenow uses theImageFallbackcomponent (instead of a CSS mask) to display fallbacks on error.
CSS Classes & Stylesheet
CSS import path: stream-chat-react/dist/css/v2/* is no longer valid. Use stream-chat-react/dist/css/* instead.
Removed CSS variables: --str-chat__message-bounce-*, --str-chat__jump-to-latest-message-*
| Old class | New class |
|---|---|
str-chat__channel-preview* |
str-chat__channel-list-item* |
str-chat__channel-preview-container |
str-chat__channel-list-item-container |
str-chat__message-input-cooldown |
str-chat__message-composer-cooldown |
str-chat__message-simple-name |
str-chat__message-metadata__name |
str-chat__simple-message--error-failed |
str-chat__message-inner--error |
str-chat__message-simple-timestamp |
str-chat__message-metadata__timestamp |
str-chat__message-error-icon |
str-chat__message-error-indicator |
str-chat__reaction-list |
str-chat__message-reactions |
str-chat__message-reactions |
str-chat__message-reactions__list |
str-chat__message-reaction |
str-chat__message-reactions__list-item |
str-chat__message-reaction-emoji |
str-chat__message-reactions__item-icon |
str-chat__message-reaction-count |
str-chat__message-reactions__item-count |
str-chat__reaction-list--counter |
str-chat__message-reactions__total-count |
str-chat__channel-list-messenger |
str-chat__channel-list-inner |
str-chat__channel-header-end |
str-chat__channel-header__data |
str-chat__message-reactions-container |
(removed) |
str-chat__reaction-list--reverse |
(removed) |
str-chat__message-reaction-own |
(removed) |
str-chat__message-simple (root) |
(removed from MessageUI) |
str-chat__avatar--single |
(removed) |
str-chat__avatar-group--three-part |
(removed) |
Sidebar, Polls, Dialogs & Misc
- Sidebar state is now app-owned. The
initialNavOpenprop andnavOpen/openMobileNav/closeMobileNavfromuseChatContext()have been removed. Manage sidebar state in your own app and inject toggle UI viaHeaderStartContent. See the Collapsible Sidebar cookbook. - Explicit query limits required.
ChannelandChannelListno longer inject default query limits:<Channel channelQueryOptions={{ messages: { limit: 20 } }}> <ChannelList options={{ limit: 30 }} />
- Poll components renamed:
AddCommentFormβAddCommentPrompt,EndPollDialogβEndPollAlert,SuggestPollOptionFormβSuggestPollOptionPrompt.QuotedPollandPoll.isQuotedremoved. Modalreplaced byGlobalModal. Dismiss dialogs viauseModalContext(). The.str-chat__modal__innerwrapper no longer exists.useChannelPreviewInfo()now always returns a definedgroupChannelDisplayInfo. Code checkinggroupChannelDisplayInfo == nullas "not a group" should be updated togroupChannelDisplayInfo.members.length >= 2.ChannelHeader.liveremoved. The header no longer renderschannel.data.subtitleunder the title.DropdownProps:openButtonPropsβTriggerComponent;dialogIdremoved.addNotificationfromChannelStateContextreplaced with theclient.notificationsAPI.
β¨ New Features
UI & Theming
- Full visual refresh β every component redesigned: message bubbles, reactions, channel previews, thread headers, typing indicators, polls, attachment previews, loading states, search, date separators, and more.
- Dark mode β official dark theme across the full component set, toggled via CSS variable palettes.
- New CSS variable system β comprehensive palette, component-level, and global CSS custom properties for deep theming without overriding internal selectors.
- Migrated to Phosphor icon set β all SDK icons replaced with Phosphor icons, exported individually as
Icon*named exports.
Message & Actions
- New
MessageActions&ContextMenuAPI β message actions rebuilt on a general-purpose context menu system. Filter, reorder, or add actions viamessageActionSet/defaultMessageActionSetwithquick-toggleanddropdownplacement support. ContextMenuanimations API β global close-on-click-outside configuration, enter/exit transitions, andContextMenuButton,ContextMenuHeader,ContextMenuBackButtonprimitives.MessageEditedIndicatorβ new component with label + tooltip showing when a message was last edited.- Message translation indicator β visual indicator on auto-translated messages with toggle to view the original text.
- Download attachment action β new built-in "Download" action in the message actions menu.
- Redesigned deleted message UI via
MessageDeletedBubble, now shown inside the message bubble with annotations, metadata, and replies button.
Message List
- Smooth scrolling added to
MessageList. ScrollToLatestMessageButtonnow rendered by default inside the message list with redesigned markup.UnreadMessagesSeparatornow shows the unread count by default and includes a mark-read button. PassshowCount={false}for simpler behavior.
Composer
- Attachment upload progress tracked and displayed in real time in
AttachmentPreviewList. AttachmentSelectorredesigned with command submenu support andselectCommandaction.LinkPreviewListnow shows one preview by default and no longer suppresses previews while quoting.
Reactions
- Extended
ReactionSelectorwith extended emoji picker mode. MessageReactionsDetail(replacesReactionsListModal) β redesigned reaction detail rendered in a dialog, with extended reaction list and per-user breakdown.
Avatar & Gallery
- New
AvatarandGroupAvatardesigns with updated markup and automatic overflow handling. - New
AvatarStackcomponent with configurablecapLimitand overflow badge, used in message reply buttons and typing indicator. - Proprietary
Gallerycomponent replacesreact-image-gallery.ModalGalleryhandles the thumbnail-grid-plus-viewer experience. Shared gallery preview added toAttachmentPreviewList. MediaBadgeβ new component for labeling media attachments.
Audio
- Improved wave progress bar smoothness and sizing.
- Audio player now resets progress when the track finishes.
- New "Voice message deleted" notification.
Channel List & Search
ChannelListItem(formerlyChannelPreviewMessenger) fully redesigned.Searchpromoted to stable with redesigned UI;ChannelSearchdropped.- Redesigned channel list loading skeletons, reused for thread list.
Thread & Headers
- Thread preview fully redesigned.
ChatView.ThreadAdapternow shows an empty-state placeholder when no thread is selected.- Dual typing indicators:
TypingIndicator(message list, with avatar stack + animated dots) and newTypingIndicatorHeader(channel/thread header subtitle) for distinct placement contexts. - Redesigned
ChannelHeaderandThreadHeader.
Sidebar & Layout
- Sidebar toggle externalized β state is now fully app-owned via
HeaderStartContent/HeaderEndContent. - Sidebar display control API added.
Notifications
NotificationListreplacesMessageListNotifications, now parented underMessageListMainPanel.useNotificationApi()wrapper for app-owned notification management.
Polls
- Redesigned poll in-message UI and poll creation dialog.
- Redesigned poll actions modals.
Misc
channelActionSetintroduced for channel-level action customization.useChannelListContext()diagnostic parameter removed (no-arg call only).TypingIndicatorno longer manually slices typing users β delegates toAvatarStack'scapLimit.
π Bug Fixes
MessageList
- Pinned message highlight now extends edge-to-edge across the full list width
- Fixed jump-to-message snap-back caused by bottom autoscroll interference
- Fixed scroll position not being maintained when new messages arrive
- Set correct width on the scroll container to prevent layout overflow
- Prevented floating date separator from being hidden by scroll position
MessageUI
- Used
isDeletedflag consistently to determine deletion state across all components - Unified "deleted message" definition across all rendering components
- Corrected read-status calculation for the first message in a channel
- Fixed padding for messages containing only images
Composer
- Prevented empty textarea from growing beyond its initial height
- Composer state now cleared on unmount, preventing stale drafts
- Aligned textarea placeholder and text with surrounding UI
- Attachment previews now wrap correctly on narrow viewports
- Hidden attachment selector and action buttons when a slash command is active
- Voice recorder button now correctly shown when quoting a message
Audio
- Improved wave progress bar smoothness and sizing consistency
Giphy
- Fixed layout shifts in Giphy preview by applying a fixed height
- Only attachments of type
giphyare now categorized as Giphy - Disabled pointer interactions on Giphy previews
- Fixed Giphy argument being incorrectly exposed in quoted message / channel preview
Polls
- Made poll forms submittable via Enter key and submit button
- Prevented poll options from layout-shifting on vote
- Fixed suggesting a poll option incorrectly casting a vote
- Removed extra bottom padding from voted option rows in results view
- Removed tooltip from
PollVote - Corrected modal title casing, placeholder text, and button placement
Reactions
- Message reactions now aligned vertically to the center of the message list
Dialog
- Prevented outside-click events from closing dialogs managed by a different instance
- Post-review layout and accessibility fixes for
MessageReactionsDetail
ChannelList
- Fixed dialog portal rendering outside its expected DOM position
- Fixed ChatView selector button styles and icon alignment
Navigation
- Improved click-origin detection before closing mobile nav sidebar
- Prevented mobile sidebar overlays from shifting main chat content
ContextMenu
- Command menus now sorted consistently
- Command menus now maintain a constant distance from their invoking button
Search
- Search correctly exits on input blur (keyboard dismiss on mobile)
Threading
- Toggle sidebar button now shown in thread view's
ThreadHeader
Read State
- Fixed unread count being incorrectly incremented by
useMarkReadwhen read events are disabled
Styling
- Single delivery checkmark now uses the correct color in dark mode
- Correct inverse text color tokens applied in themed components
- Cleaned up CSS build output; removed dead rules and unused variables
Misc
- Fixed
isDayjsimport for ESM bundlers useNotificationTargetnow correctly allows returningundefined- Removed
customMessageDatafromhandleSubmittype declaration - Allowed forwarding
unsafeHTMLto system messages (EventComponent) - Stopped typewriter animation on
ai_indicator.stopevent