Libraries
@veltdev/react@veltdev/client@veltdev/sdk
New Features
- [Recorder]: Added
recorderfield onVeltDataProvideraccepting aRecorderAnnotationDataProvider. When configured viasetDataProviders(), recording PII (user identity, transcription, attachment URLs) is stripped from annotations before being written to Velt’s Firestore and routed to your own storage via resolver callbacks or config-based HTTP endpoints. On read, the resolved PII is merged back transparently. Learn more →
- React / Next.js
- Other Frameworks
isRecorderResolverUsed on RecorderAnnotation to show a loading state while PII is being fetched, and isUrlAvailable to show an upload progress indicator while the recording URL is still a local blob.- [REST API]: Added two endpoints for asynchronous document migration. Migrate Documents initiates a migration that migrates all data from one document to another. Migrate Documents Status → polls progress using the
migrationIdreturned by the initiate call.
Improvements
-
[Recorder]: Added
RECORDER_RESOLVERtoCoreEventTypesMapwith a full 3-stage lifecycle (request formed → triggered → result/error) for get, save, and delete resolver operations. Consistent with the existing comment, reaction, and attachment resolver event patterns. -
[Core]: The
get,save, anddeletemethods onCommentAnnotationDataProvider,ReactionAnnotationDataProvider, andAttachmentDataProviderare now optional. Developers using config-based URL endpoints (config.getConfig,config.saveConfig,config.deleteConfig) no longer need to supply placeholder callbacks.ResolverConfigalso gains a newadditionalFields?: string[]property for including custom fields in resolver payloads. -
[Core]: Added
attachmentScope?: stringtoUploadFileOptionsto specify which scopedAttachmentDataProviderto route an upload to (e.g.,'default'for comment attachments,'recorder'for recording files). Defaults to'default'when omitted.
Bug Fixes
-
[Comments]: Fixed text selection highlighting not activating for submitted (non-draft) comment annotations. The
textClickedflag is now set correctly for all selected annotations whenlastistrue, not only drafts. - [REST API]: Fixed “Transaction too big” errors during document migration by reducing Firestore batch size from 500 to 100 in subcollection copy, notification copy, and user doc config operations. Migrations involving documents with large notification or comment payloads will no longer fail.
New Features
-
[Activity Logs]: A complete, real-time record of everything that happens across your product. Velt automatically generates activity log records for Comments, Reactions, Recorder, and CRDT features, and you can push custom events (deployments, status changes, escalations) into the same timeline using
createActivity(). Subscribe org-wide for admin dashboards, filter by document for inline timelines, or scope by feature type to reduce noise. Learn more → -
[CRDT]: Added
setActivityDebounceTime(time)onCrdtElementto control how long editor keystrokes are batched before flushing a single activity log record. Default: 10 minutes. Minimum: 10 seconds. Documentation → -
[Activity Logs REST API]: Added CRUD endpoints for activity log records (
/v2/activities/get,/v2/activities/add,/v2/activities/update,/v2/activities/delete). Also added atriggerActivitiesflag onPOST /v2/commentannotations/addto auto-create activity log records when comments are added. REST API Reference →
Bug Fixes
- [Comments]: Fixed temp annotation context being cleared prematurely during comment submission in composer mode, preventing stale context from affecting subsequent comment operations.
Bug Fixes
-
[Comments]: Fixed sidebar filters restored from
sessionStoragebeing overwritten by the initial empty emission on page reload. - [Comments]: Fixed DOM annotation visibility diverging from sidebar filter state when filters were restored from session storage or set via defaults.
-
[Comments]: Fixed
mergeClientFiltersnot handlingnullor empty{}filter objects correctly, which prevented filters from being cleared. - [Comments]: Fixed autocomplete hotkey button inserting a duplicate character when the hotkey already existed at the cursor position.
- [Comments]: Fixed autocomplete cursor save/restore failing inside shadow DOM.
-
[Comments]: Fixed partial
@mentionreplacement when one tagged user’s name is a prefix of another (e.g.,@Alicecorrupting@AliceSmith). - [Comments]: Fixed multi-thread comment annotations not being filtered by sidebar filter state in the DOM.
New Features
-
[UI Customization]: Added 13 standalone autocomplete primitive components (
VeltAutocompleteOption,VeltAutocompleteChip,VeltAutocompleteEmpty, etc.) for building fully custom autocomplete UIs without requiring the full<velt-autocomplete>panel. Learn More → -
[UI Customization]: Added
multiSelect,selectedFirstOrdering,readOnly,inline, andcontactsprops to theVeltAutocompletepanel component.
Improvements
-
[Access Control]:
AccessRequestEventandSEMEventnow includetotalUsers,presenceSnippylyUserIds, andpresenceClientUserIdsfields for real-time presence context. -
[Analytics]:
COMMENT_ADDEDandCOMMENT_STATUS_CHANGEDevents now includecommentAnnotationCreatedAt,taggedClientUserIds, andtaggedSnippylyUserIds. -
[Analytics]: New
REACTION_ADDEDandREACTION_DELETEDevents fire withannotationId,commentId,reactionId, andcommentMode. -
[Analytics]: Added
CRDT_DATA_UPDATEDanalytics event with deduplication.
Bug Fixes
-
[Core]: Fixed
client.setDocuments()triggering duplicate concurrent initializations when called multiple times in rapid succession with identical document IDs and options. -
[Comments]: Replaced custom
VeltCommentDialogVisibilityBannerDropdownContentUserPickersub-components with the shared autocomplete component.
New Features
- [Comments]: Added Private Comments UI. Enable it with
visibilityOptions. Users see a persistent banner below the composer with four visibility levels —public,organization-private,restricted-self, andrestricted— and an inline user-picker (search, avatar list, multi-select) whenrestrictedis chosen. Visibility can also be changed after submission from the thread options menu.
- React / Next.js
- Other Frameworks
VeltCommentDialogWireframe.VisibilityBanner.* / velt-comment-dialog-visibility-banner-* family.- [Comments]: Added
AddCommentRequest.visibilityfield of typeCommentVisibilityConfigto set comment visibility at creation time. Previously visibility could only be set after creation viaupdateVisibility().
- React / Next.js
- Other Frameworks
Improvements
- [Comments]:
VisibilityOptionClickedEventnow includes an optionalusersfield containing the list of selected users whenvisibility === 'restricted'. Previously, the event only reported the visibility type string.
- React / Next.js
- Other Frameworks
- [Comments]:
CommentSaveTriggeredEventnow includes acommentAnnotationfield with the full annotation object at save time. Handlers foronCommentSaveTriggeredcan now access comment content, assignment, and visibility state without a separate lookup.
New Features
- [Comments]: Added
AnonymousUserDataProviderto resolve email →userIdmappings for users who are tagged by email in comments but are not part of the contact list. When a comment is saved and a tagged contact ortorecipient has an email but nouserId, the SDK calls the registered provider to look up theuserIdand backfills it into the comment data before persisting.
- React / Next.js
- Other Frameworks
UserDataProvider is configured, resolved user IDs are automatically backfilled to the organization database as stub user records ({ userId, name: email, email }). If a UserDataProvider is already configured, the org DB backfill is skipped.Improvements
-
[Comments]: Comment annotations now store a top-level
visibilityConfigfield ({ type, organizationId, userIds }) alongside the existingcontext.accessFieldstokens. This makes the original visibility setting inspectable without reversing hashed tokens. Annotations without an explicit visibility setting default to{ type: 'public' }. Thecontext.accessFieldstokens continue to govern actual access control. -
[Comments]: When setting restricted visibility, the current user’s
userIdis now automatically appended touserIds(deduplicated) if not already present. Existing explicituserIdslists are preserved. This applies acrossenablePrivateMode,addCommentAnnotation, andupdateVisibility.
New Features
- [Comments]: Added a
commentSaveTriggeredevent that fires immediately when a user clicks the save button, before the async save completes. Use it for immediate pre-save feedback alongside the existingcommentSavedevent, which continues to fire after the save finishes.
- React / Next.js
- Other Frameworks
CommentSaveTriggeredEvent interface has the following shape:Improvements
- [Comments]: The sidebar now automatically returns to the full comment list when all annotations are deselected while in focused thread mode.
- [Comments]: Page scroll position is now preserved when navigating to a highlighted annotation from the sidebar.
New Features
- [Comments]: Added a visibility dropdown to the comment composer, letting users set a comment’s visibility to
publicorprivatebefore submitting. Disabled by default; enable it via thevisibilityOptionDropdownprop or API methods. AvisibilityOptionClickedevent fires on each selection, emitting the annotation ID, fullCommentAnnotation, and chosen visibility.
- React / Next.js
- Other Frameworks
Bug Fixes
- [Comments Sidebar]: Fixed the “(This page)” indicator not appearing for locations identified by
locationNameinstead ofid. The sidebar now matches the current location byid,locationName, or legacylocationId, in that order.
Bug Fixes
-
[Comments]: Fixed temporary composer annotations (prefixed
TEMP_COMPOSER_) being inadvertently persisted to the database. Guards were added so temp annotations remain client-only and are never written to the database. -
[Comments]: Fixed the comment dialog calling
markAsRead()forTEMP_COMPOSER_annotations that do not yet exist in the database. The call is now guarded so only persisted annotations are marked read when a pin is selected. -
[Comments Sidebar]: Fixed the sidebar failing to identify the current page’s annotation group when a location is configured with
locationNamebut noid. The sidebar now resolves the current location usinglocation.idfirst, thenlocation.locationName, then alphabetical order. - [Notifications]: Fixed a race condition where a stale async call completing after a newer one could overwrite the user’s saved notification config with defaults.
- [Comments]: Fixed comment pins being placed at incorrect positions on video timelines whose total duration is not a whole number of seconds. Fractional-second durations are now preserved correctly.
New Features
- [Comments]: Added
enablePrivateMode(config)anddisablePrivateMode()methods to set a global visibility policy for all newly created comments. Supportsrestricted(user-list),organizationPrivate, andpublicvisibility types via the newPrivateModeConfigtype.
- React / Next.js
- Other Frameworks
- [Comments]: Added a
commentSavedevent that fires after a comment is persisted to the database, providing a reliable signal for triggering downstream actions. The payload includes the annotation ID, fullCommentAnnotation, andVeltEventMetadata.
- React / Next.js
- Other Frameworks
- [Notifications]: Added opt-in notification delay and batching pipeline for comment notifications. Configure
delayConfigto hold notifications and suppress delivery if a user views the comment during the delay window. ConfigurebatchConfigto accumulate notifications per document or per user before delivery, reducing noise on high-activity content. Webhooks and workflow triggers always fire immediately and are never subject to delay or batching.
notificationServiceConfig in your workspace notification settings in the Velt Console. Learn more- [Notifications]: Webhook payloads now include per-user notification preferences for all involved users. Depending on the config level, payloads carry either
usersOrganizationNotificationsConfigorusersDocumentNotificationsConfig, enabling downstream consumers to route notifications based on each user’s settings. SeeUserNotificationsConfigfor the type definition. Learn more
- Webhook Payload — Org-Level Config
- Webhook Payload — Document-Level Config
- [Notifications]: The
getConfignotification API now supports agetOrganizationConfig: trueoption to retrieve org-level notification config for a user.documentIdsis now optional insetConfig— omitting it applies the config at the organization level as the user’s default for all documents. setConfig | getConfig
- setConfig — Org-Level
- getConfig — Org-Level
Improvements
- [Comments]: Added auto-resolution of the organization ID from the current org configuration when
updateVisibility()orenablePrivateMode()is called withtype: 'organizationPrivate'and noorganizationIdis provided.
Bug Fixes
-
[Comments]: Fixed global dark mode toggling not affecting open comment dialogs. Dialog initialization no longer sets a component-level dark mode override that would block
ThemeServicepropagation. -
[Comments]: Fixed composer placeholder text not reappearing after a user typed and deleted all text. The contenteditable element is now cleared with
innerHTML = ''to ensure the CSS:empty::beforeplaceholder renders correctly. -
[Comments]: Fixed SVG gradient, clip-path, and filter rendering for duplicate emoji reactions. Each emoji SVG instance now receives unique internal IDs via
EmojiService.uniquifySvgIds(). - [Comments]: Fixed priority dropdown showing an incorrect background color in dark mode when no priority was set.
-
[Comments]: Fixed user migration not updating
{{userId}}placeholders incommentText/commentHtmland not remappingviews/viewedByUserIdsby internal user key. All userId references in comment content and view tracking are now correctly updated during migration.
Improvements
-
[Comments]: Added backward compatibility so V4 custom wireframes using property names
allowAssignment,allowEdit,allowToggleNotification, andallowChangeCommentAccessModeautomatically resolve to their v5 equivalents. No changes to your wireframe code are required when upgrading from v4 to v5. -
[Comments]: Added edit composer wireframe reuse in comment thread cards so it now applies the same
velt-comment-dialog-composer-wireframecustomization as the reply composer. Previously the edit composer always rendered the default template.
Bug Fixes
-
[Comments]: Fixed custom wireframes for nested comment dialog components — including thread cards, priority/status dropdowns, attachment layouts, reply avatars, and seen dropdowns — silently falling back to the default template instead of rendering correctly. This restores the v4 behavior where parent components extracted nested wireframes via
querySelectorand passed them to children. -
[Comments]: Fixed
veltDynamicTemplateplacement in multiple components so it wraps only the replaceable inner content (e.g., an icon) instead of the entire component structure. Previously the default template always rendered and the wireframe content was never injected. -
[Comments]: Fixed
velt-classconditional styling in custom wireframes not resolving correctly for per-item data such as{commentObj.*},{attachment.*}, and{file.*}. AddedapplyConditionalClasses()calls with per-item data contexts across 40+ comment dialog primitive components. -
[Comments]: Fixed click event handlers being lost when custom wireframes replace default content by moving handlers from inside
veltDynamicTemplateblocks to wrapper elements outside the template directive. This restores click functionality for custom wireframes on mark-as-read, dropdown items, options, and priority/status items. -
[Comments]: Fixed per-dialog state (
localUIStateSignal) not being propagated to child primitives andveltDynamicTemplatecontexts throughout the entire comment dialog component tree, including through wireframe-replaced sections. -
[Comments]: Fixed custom wireframes using data bindings like
<VeltData field="attachment.name" />displaying empty content by adding per-item data fields (attachment,commentObj,file,item, etc.) toveltDynamicTemplatecontext objects. -
[Comments]: Fixed layout issues caused by styled wrapper elements persisting outside the template when wireframes replaced inner content. Visual styling classes (width, height, padding) are now inside the
veltDynamicTemplatedefault content. -
[Comments]: Restored CSS class names on the priority dropdown content item components to their v4 names (
velt-priority-dropdown-content-item,velt-priority-dropdown-content-item-tick,s-priority-*) so existing CSS overrides continue to work without changes. - [Comments]: Fixed mark-as-read not firing when clicking a comment in sidebar focused-thread mode or inline comment section mode. Previously the comment dialog is always in a selected state in these modes, preventing the mark-as-read path from triggering.
- [Comments]: Fixed the attachment image download button not hiding for anonymous users, disabled states, and expired plans. The button now correctly matches v4 behavior.
-
[Comments]: Fixed attachment loading spinners crashing when
config.uiStateis not yet initialized (e.g., in standalone usage or during initialization race conditions). - [Comments]: Fixed sidebar deselection accidentally re-selecting an annotation that was already removed from the selected annotations map by another code path.
New Features
- [Comments]: Added
enableAttachmentDownload()/disableAttachmentDownload()API methods and anattachmentDownloadprop on<VeltComments>to control whether clicking an attachment triggers a file download. A newattachmentDownloadClickedevent fires on every attachment click regardless of the download setting, letting you intercept clicks for custom viewers, analytics, or access control. Download is enabled by default so there is no breaking change.
- React / Next.js
- Other Frameworks
AttachmentDownloadClickedEvent interface has the following shape:Improvements
-
[Comments]: The wireframe template for the resolve and unresolve buttons in the assignee banner is now nested inside the button component rather than wrapping it, giving custom wireframes direct access to button state, styling, and event handlers. The affected wireframes are
velt-comment-dialog-assignee-banner-resolve-button-wireframeandvelt-comment-dialog-assignee-banner-unresolve-button-wireframe. -
[Comments]: Added CSS classes to comment composer attachment components to reflect loading and edit-mode states:
.velt-composer-attachment-container,.velt-composer-attachment--loading, and.velt-composer-attachment--edit-mode. -
[Comments]: Added
.s-comment-dialog-assign-to-menuand.velt-thread-card--assign-to-menuCSS classes to the assign-to menu component for more granular styling control.
Bug Fixes
-
[Comments]: Added
'iframe'to the list of non-nestable elements so thatgetHostElement()returns the iframe’s parent element instead of attempting to place a comment pin inside the iframe document context. - [Comments]: Fixed a regression where navigating back from a focused thread triggered an unintended draft auto-save. A guard now skips auto-save when the focused thread dialog is destroyed via back navigation.
- [Comments]: Fixed stale selection state in the sidebar after back-navigating from a focused annotation. The annotation is now properly deselected from the internal selection map on exit.
-
[Comments]: Thread card attachment components now use
isTemplateEmpty()to detect empty wireframe templates instead of a truthy check, so attachments correctly fall back to default rendering when an empty wireframe is provided. - [Comments]: Custom thread card wireframes that do not include an edit composer wireframe now automatically render the default edit composer, so inline comment editing remains functional without requiring wireframe changes.
New Features
- [Comments]: Added
clearContextoption toPageModeComposerConfigto control whether comment context is cleared after page mode composer submission. SetclearContext: falseto preserve context data across submissions (defaults totrue).
- React / Next.js
- Other Frameworks
Bug Fixes
-
[Comments]: Removed host CSS classes
velt-composer-openandvelt-composer-input-focusedfrom the Comment Dialog Composer component. If your custom styles targeted these classes, update your selectors accordingly. -
[Comments]: Fixed wireframe template forwarding in Comment Dialog so custom templates set via
dialogTemplateare now correctly applied to all child components. -
[Comments]: Fixed nested wireframe template extraction in Comment Dialog Threads so custom
velt-comment-dialog-thread-card-wireframeandvelt-comment-dialog-more-reply-wireframetemplates are correctly applied. - [Comments]: Fixed Mark as Read/Unread wireframe template structure so custom wireframe templates now provide proper control over the button’s internal elements.
- [Comments]: Added proper wireframe template wrapper to the parent Mark as Read component with a clickable container that includes accessibility attributes for the toggle action.
-
[Comments]: Fixed comment annotation data resolution in button click handlers so
commentAnnotationcontext data now correctly resolves from the updated component config structure.
New Features
-
[CRDT]: Added Add CRDT Data REST API to create new CRDT editor data on the backend. Supports
text,map,array, andxmltypes for use with Multiplayer Editing (Yjs). - [CRDT]: Added Update CRDT Data REST API to replace existing CRDT editor data. Generates proper CRDT operations so connected clients pick up the change automatically.
Bug Fixes
- [Comments]: Fixed edit mode not working in thread card messages. Edit mode now properly propagates to comment messages within thread cards.
Improvements
- [Comments]: Updated
updateVisibility()withtype: 'restricted'to auto-default to the current authenticated user when nouserIdsare provided. Developers no longer need to manually pass the current user’s ID.
- React / Next.js
- Other Frameworks
- [Comments]: Improved performance of
getCommentAnnotationsCount()by automatically batching queries when 2+documentIdsare provided. You can customize the debounce delay withdebounceMsparameter (default 5000ms).
- React / Next.js
- Other Frameworks
- [Comments]: Deprecated legacy
enablePrivateCommentMode(),disablePrivateCommentMode(), andupdateAccess()methods. These are replaced by the visibility API. Existing usage continues to work but IDEs will show deprecation warnings.
Improvements
-
[Core]: Added ability to control Firestore SDK logs via
sessionStorageor environment config. By default, logs are silenced to reduce console noise in production. - [Performance]: Added GSAP animation detection to reduce MutationObserver overhead. Pages using GSAP now experience ~20x performance improvement (from ~375ms to ~18ms per callback).
Bug Fixes
- [Comments]: Fixed cursor position loss on mobile when selecting autocomplete options. The cursor now stays at the correct position after selecting @-mentions.
- [Comments]: Fixed hotkey insertion in autocomplete tool. Clicking the autocomplete trigger button (e.g. ”@”) now inserts at cursor position on all browsers, preserving mention spans.
- [Comments]: Fixed autocomplete panel click events bubbling through dropdown. Selecting options no longer accidentally triggers underlying elements on mobile browsers.
-
[Comments]: Disabled format options (bold, italic, etc.) by default. To enable, set
enableFormatOptions: truein your comment configuration. - [Comments]: Fixed cursor position in bottomsheet mode after selecting mentions. The cursor now appears after the mention span instead of jumping to the beginning.
- [Comments]: Fixed attachment components not receiving parent UI state. Selected and invalid attachment components now correctly react to parent composer state changes.
New Features
- [Comments]: Added rich text formatting toolbar for comment composers. Users can apply bold, italic, underline, and strikethrough formatting to emphasize text.
- React / Next.js
- Other Frameworks
- [Comments]: Added
clearComposer()method to programmatically reset composer state (text, attachments, recordings, tagged users).
- React / Next.js
- Other Frameworks
- [Comments]: Added
getComposerData()method to retrieve current composer state synchronously without subscribing to events.
- React / Next.js
- Other Frameworks
- [Comments]: Added
contextprop toVeltCommentDialogComposerto attach custom context data to comments created from standalone composers.
- React / Next.js
- Other Frameworks
Improvements
- [Comments]: Updated
composerTextChangeevent to include the full draft annotation object andtargetComposerElementId. Access tagged users, attachments, recordings, context, and assign-to data without additional API calls.
- React / Next.js
- Other Frameworks
- [Notifications]: Fixed notification panel settings accordion wireframes to properly forward custom trigger and content templates to child components.
Bug Fixes
-
[Comments]: Fixed
assignToTypeto correctly respect values set via attribute or API without being overridden by hardcoded defaults. - [Comments]: Fixed formatted text (bold, italic, underline, strikethrough) to preserve formatting on submit and edit.
New Features
- [Comments]: Added page mode composer context APIs to pass context when opening the sidebar via the comment tool. When enabled, clicking the comment tool opens the sidebar with the page mode composer and passes configured context automatically.
- React / Next.js
- Other Frameworks
- [Comments]: Added
setAssignToType()method to switch the assignment UI between dropdown and checkbox modes. Checkbox mode allows quick self-assignment with a toggle.
- React / Next.js
- Other Frameworks
- [Comments]: Added “Assigned to me” filter option in the sidebar to filter comments by assignment.
- React / Next.js
- Other Frameworks
- [Comments]: Added new event types to track comment tool and sidebar button clicks. Subscribe to these events to access context data for analytics and custom workflows.
- React / Next.js
- Other Frameworks
- [Comments]: Added
readOnlyprop to control read-only mode at the component level. The local prop takes precedence over global settings when explicitly set.
- React / Next.js
- Other Frameworks
- [Comments]: Added wireframe component to customize the assign button on thread cards.
- React / Next.js
- Other Frameworks
- [Comments]: Added wireframe component to customize the edit composer within comment thread cards.
- React / Next.js
- Other Frameworks
- [Comments]: Added reaction pin component to pin specific reactions and exclude them from the general list.
- React / Next.js
- Other Frameworks
- [Comments]: Added
resolvedByUserproperty onCommentAnnotationto access the full user object of who resolved a comment.
Improvements
- [Comments]: Renamed
targetElementIdtotargetComposerElementIdonVeltCommentComposerfor clarity.
- React / Next.js
- Other Frameworks
- [Comments]: Added CSS class
.velt-assign-dropdown--checkbox-icon-selectedto style the checkbox selected state.
Bug Fixes
- [Comments]: Fixed cursor jumping when clicking autocomplete tool buttons. Text now inserts at the correct cursor position.
- [Comments]: Fixed actions menu visibility so it remains visible when the assignment dropdown is opened.
- [Comments]: Added “Assign” tooltip to the assignment button in thread cards.
- [Comments]: Fixed “Assign To” label capitalization to “Assign to”.
- [Reactions]: Added
.velt-reaction-pin--no-reactionsCSS class for styling empty reaction pins. - [Comments]: Fixed autocomplete panel viewport height to respect custom
itemSizefromautoCompleteScrollConfig. - [Comments]: Fixed attachment metadata handling to use fallback values when metadata is unavailable.
- [Comments]: Fixed read-only state management so local
readOnlyprops are not overridden by global state changes. - [Reactions]: Fixed reactions panel to return an empty array on error instead of default emojis.
- [Comments]: Fixed
reactionIdprop onVeltCommentDialogWireframe.ThreadCard.ReactionPinto properly convert to dashed-case in React.
New Features
- [Notifications]: Added ability to enable organization-level notification settings. This allows you to configure notifications once for all documents in an organization instead of per document.
- React / Next.js
- Other Frameworks
Improvements
- [Comments]: Comments sidebar group-by views now display “Unassigned” for annotations without assignees and “Untagged” for annotations without tagged users.
Bug Fixes
- [Comments]: Fixed an issue where image attachments in comment dialog were not opening in a lightbox view.
-
[Comments]: Fixed an issue where sometimes user mentions did not include the leading
@symbol in display text. - [Comments]: Fixed an issue where the recorder control panel in comment dialog composer did not appear when a valid comment dialog ID was not present in component configuration.
- [Comments]: Fixed an issue where assignment and private comment options did not respect explicit configuration in sidebar mode.
-
[Comments]: Fixed an issue where the comment dialog internal tag was changed from
snippyly-comment-dialogtovelt-comment-dialog-internalfor correct sidebar focus and keyboard behavior.
Improvements
- [Comments]: Added ability to enable/disable Private Comments feature in Velt Console
Improvements
- [Comments]: Added
batchedPerDocumentmode forgetCommentAnnotationsCount()that makes the query more efficient by up to 80% while maintaining per-document granularity. Very useful for UIs that need to display comment counts for 100 documents or less on the same page.
- React / Next.js
- Other Frameworks
Bug Fixes
- [Comments]: Fixed draft mode not working properly. Draft content is now preserved when the dialog is closed and the shake animation now works as expected.
-
[Comments]: Fixed context property access in
velt-dataelements. Templates can now access context properties using{context.propertyName}patterns. - [Comments]: Fixed edit mode state persisting after dialog close. Reopening the dialog now shows the normal view instead of the edit composer.
- [Comments]: Fixed text reappearing when using select-all-and-delete in edit mode composer. Users can now properly delete all text in edit mode.
- [Comments]: Fixed links in comment body not clickable. Clicking links in comment text now opens them in a new tab.
- [Comments]: Fixed paste handling. Pasting a URL over selected text creates a hyperlink, multiline text preserves line breaks, and images paste as attachments.
- [Comments]: Fixed ghost comment banners not displaying. “Comment is syncing…” messages now properly show while annotation data is loading.
- [Comments]: Fixed priority selection not working on new annotations. Users can now set priority before submitting the first comment.
-
[Comments]: Fixed email detection after @ symbol. Typing
@user@example.comand pressing space now creates an email mention. - [Comments]: Fixed recording in progress flag not clearing. Dialog now properly closes on click outside after recording finishes.
- [Comments]: Fixed links and @here mentions not highlighted in comment text. URLs are now styled as clickable links and @here mentions are properly highlighted.
New Features
- [Comments]: Introducing Private Comments feature: Added
updateVisibility()method to programmatically set comment access (public, organizationPrivate, or restricted). Learn more
- React / Next.js
- Other Frameworks
Bug Fixes
- [Comments]: Fixed mentioned users not receiving notifications. Users @mentioned in comments now correctly receive notifications.
- [Comments]: Fixed notification action type validation. Clients only receive data for valid event types.
- [Comments]: Fixed status reset when deleting comments. Status now only resets when current status is terminal.
New Features
- [Comments]: Added
addCommentAnnotationDraftevent to dynamically set context when creating comment annotations. Triggered beforeaddCommentAnnotationevent clicks on the comment tool and the composer is rendered.
- React / Next.js
- Other Frameworks
Improvements
- [Comments]: Added
setContextProvidermethod to set a global context provider for all comment annotations. Also addeduseSetContextProviderhook for React applications.
- React / Next.js
- Other Frameworks
Bug Fixes
- [Comments]: Fixed page mode and multi-thread annotation ID not found error. Page mode and multi-thread comments now work as expected.
-
[Comments]: Fixed
updateOverlayPositionfunction not triggering. Comment dialog now opens in the correct position. - [Comments]: Fixed unread status issues in inline and focused thread modes. Annotations are now marked as read when opened or clicked.
- [Comments]: Fixed three-dot menu not visible in sidebar.
- [Comments]: Fixed composer not being focused when opened.
- [Comments]: Fixed comments navigating on click. Comments now only navigate when the navigation button is clicked.
Bug Fixes
- [Comments]: Fixed
lastUpdatedtimestamp not being updated when changing context in comment annotation via SDK. Ensures context updates are properly synced to other users.
Improvements
- [Core]: Added robustness to initialization when
VeltProviderwas re-rendered multiple times over a slow network.
Bug Fixes
-
[Comments]: Refactored
submitCommentmethod to fix resolver issue forvelt-comment-composer. Now follows the standard comment submission flow. - [Comments]: Fixed unread status not updating correctly in bottom sheet. This was a regression in v5.
- [Comments]: Fixed navigation button not working properly. This was a regression in v5.
-
[Comments]: Fixed disable recording option not working in
velt-comment-composer. This was a regression in v5.
New Features
- [Core]: Added
globalStylesoption to control whether Velt’s global CSS is loaded. Set tofalseto disable default styles when implementing custom theming.
- React / Next.js
- Other Frameworks
- [Comments]: Added
submitComment(targetElementId)method to programmatically trigger comment submission. Enables custom buttons or keyboard shortcuts for submitting comments.
- React / Next.js
- Other Frameworks
- [Comments]: Added
placeholderprop to customize input placeholder text in comment composer. Overrides default placeholders. Learn more
- React / Next.js
- Other Frameworks
- [Comments]: Added
composerTextChangeevent that fires when text changes in any comment composer. Enables features like auto-save drafts, character counters, or real-time validation. Learn more
- React / Next.js
- Other Frameworks
Bug Fixes
Comment Dialog Primitives
Released 115+ primitive components for building custom comment dialogs. Each subcomponent can now be used independently without requiring the full dialog structure.- React / Next.js
- Other Frameworks
- Header/Body: Header, Body, CloseButton
- Thread: ThreadCard with Avatar, Name, Time, Message, Reactions, Recordings, Reply, Options, and more
- Composer: Composer, ComposerInput, ComposerActionButton, ComposerAttachmentButton, ComposerRecorderButton, ComposerRecorderPlayer, ComposerFiles
- Dropdowns: StatusDropdown, PriorityDropdown, OptionsDropdown, CustomAnnotationDropdown (each with full sub-component breakdown)
- Additional: ReplyAvatars, AssigneeBanner, ResolveButton, UnresolveButton, CopyLink, DeleteButton, PrivateBanner, NavigationButton, and 90+ more

