Skip to main content

Libraries

  • @veltdev/react
  • @veltdev/client
  • @veltdev/sdk
  • @veltdev/types
July 31, 2026

Breaking Changes

  • [Comments]: contactElement.onContactSelected() and useContactSelected() now emit for every contact selection. Previously the event only emitted when the selected contact had no userId, or when the document was restricted and the selected contact was not a document member. To restore the previous filter, gate your handler with if (payload.documentAccessType === 'restricted' && !payload.isDocumentContact) { ... }. Learn more →

Improvements

  • [Comments]: Every emission of onContactSelected now includes correctly-computed isOrganizationContact and isDocumentContact flags, derived from the organization and document contact lists for any contact that has a userId. Email-only contacts always report false. Learn more →

Bug Fixes

  • [Comments]: When you use a user resolver (dataProviders.user) and it misses or fails for the logged-in user at page load, their name no longer renders as User <userId>. That placeholder is also no longer stamped into new comments, notification emails, or notification webhooks. Failed resolver attempts are no longer written to the user store, and the SDK schedules a bounded background retry at 2s / 8s / 30s to re-resolve the logged-in user.
July 29, 2026

New Features

  • [Agents]: New optional annotationVisibility field on the Run Execution REST endpoint sets who can see the comment annotations an execution creates. Pass "public" so anyone with document access sees the finding pins; the default "private" keeps them visible to organization members and admins only. Learn more →

Improvements

  • [Notifications]: Added an optional visibility object to comment notification webhook payloads. Public notifications carry no visibility key, so existing consumers need no change. Learn more →
  • [Notifications]: accessDeniedUsers now also lists the users denied by the comment’s visibility, alongside the users your Permission Provider denies. Learn more →
  • [Access Control]: Documented the prefixes Velt reserves inside context.accessFields, __velt_private_self: and organizationPrivate:. Do not name an Access Context field organizationPrivate, because Velt reads it as a visibility setting. Learn more →

Bug Fixes

  • [Comments]: Comments created with an Access Context set outside the addContext() event callback now load and still appear after a reload. This covers setContextProvider() and the context prop on components such as VeltCommentTool and VeltCommentComposer.
  • [Comments]: Making a comment private now keeps its Access Context. Previously it dropped the access object and removed the comment from that context.
  • [Comments]: Updating a comment’s Access Context now keeps its visibility, including when you clear the access object by passing null. Previously the update turned a private comment public again.
  • [Comments]: You can now edit a private comment while Access Context is enabled. Previously those updates were blocked.
  • [Comments]: A private comment no longer reaches viewers in the same Access Context who are not allowed to see it.
  • [Comments]: A private comment with an Access Context now appears only under its own context, for everyone including the author. Context is a data partition, not a permission.
  • [Comments]: Turning an already loaded comment private now removes it from other viewers’ screens right away. Previously the stale copy stayed visible until they reloaded.
  • [Comments]: Reactions, recordings, and area annotations on a private comment no longer reach viewers in the same Access Context. They do not inherit the parent comment’s Access Context, so context-scoped queries do not return them.
  • [Comments]: Turning a comment back to public now keeps it loadable when Access Context is turned off. Previously it disappeared for everyone, including the author.
  • [Comments]: Organization members now keep seeing the comments already restricted to their organization, even after you turn the Private Comments feature off in the Velt Console. Previously those comments could disappear for them.
  • [Notifications]: A notification for a private comment now reaches only the users allowed to see that comment. Every channel is covered, including the notification panel, webhooks, and email.
  • [Notifications]: Every path that emits a comment notification now respects the comment’s visibility, including the one Velt sends when a private comment is deleted. Previously that delete notification went to every user with document access.
  • [Notifications]: Notification reads are now filtered by comment visibility. A notification for a private comment is returned only to users who can see that comment, in the Get Notifications REST API and the Node and Python backend SDKs.
July 24, 2026

Bug Fixes

  • [Comments]: Fixed the comment dialog closing when you pressed Enter in the composer on pages with third-party keypress handlers (for example, Webflow or jQuery form helpers). Escape still bubbles, so dismiss behavior is unchanged.
July 20, 2026

New Features

  • [Suggestions]: enableSuggestionMode() now auto-commits by default. A bare call turns edits on tagged targets (elements with a data-velt-suggestion-target attribute) into suggestion comments with zero additional configuration, using the SDK’s default diff summary. If you previously enabled suggestion mode without a handler and committed suggestions yourself via the targetEditCommit event, pass autoCommit: false to keep that behavior. Handler-based integrations (with onTargetEditCommit) are unaffected. Learn more →
  • [Suggestions]: New optional summaryHtml field on commitSuggestion(config) and on the onTargetEditCommit return value renders a formatted HTML body (for example, a color-coded before/after diff) on the suggestion’s first comment — the comment the SDK creates when the suggestion is committed. When both summary and summaryHtml are omitted, the SDK renders a default styled diff. summaryHtml is sanitized with DOMPurify at render time. Learn more →
  • [Suggestions]: The suggestion card now renders for any annotation with type: 'suggestion' (or commentType: 'suggestion'), not only agent-generated ones. Human-authored suggestion comments get the same header, diff body, accept/reject actions, and resolved banner as agent suggestions. Learn more →

Bug Fixes

  • [Comments]: Fixed a class of stale-state bugs in the Comment Dialog’s virtual-scroll row recycling (the dialog reuses list rows as you scroll, and a reused row could carry over state from the comment it previously displayed). Drafts, edits, replies, assignee/mention state, and velt-class conditions now stay correctly bound to their own annotation through collapse/expand, group toggles, and cross-group scroll — in both the standard dialog and customer wireframes.
  • [Suggestions]: A failed suggestion commit — from autoCommit or an onTargetEditCommit handler — no longer blocks retry: call the commitSuggestion function on the targetEditCommit event payload to try again. A successful commit is still protected against an accidental double-commit.
  • [Comments]: The reply composer now closes on deselect and no longer persists onto the wrong annotation after virtual-scroll recycling.
July 20, 2026

Improvements

  • [Self-Hosting]: Internal update for GCP Full self-hosting.
July 15, 2026

Improvements

  • [Self-Hosting]: Internal update for GCP Full self-hosting.
July 14, 2026

New Features

  • [Core]: New setUnstyledMode() method turns off Velt’s built-in visual styling for headless use, keeping layout and positioning intact by default. Pass { keepFunctionalStyles: false } to strip down to browser defaults, or call with false to restore styling.

Improvements

  • [Self-Hosting]: New optional dataRegions field on the self-hosted config declares which regional data endpoints you provisioned — writes routed to an unprovisioned region now fall back to the base endpoint instead of failing. Adds asiaNorthEast1 (Tokyo) to the known regions. Learn more →

Bug Fixes

  • [Comments]: Comment Sidebar (V1) filters no longer reset unexpectedly — they survive the Reset button, persist across setLocation() changes, and are no longer wiped when sessionStorage is full.
  • [Self-Hosting]: The React SDK now applies the self-hosted data config reliably on first load.
July 10, 2026

New Features

  • [Comments]: The Comment Sidebar V2 fullscreen toggle now emits a fullscreenClick event — subscribe via commentElement.on('fullscreenClick') or useCommentEventCallback('fullscreenClick'); the payload’s fullScreen field holds the new state. Learn more →

Bug Fixes

  • [Comments]: The sidebarClose event now fires exactly once on every close — close button, outside click, or the closeCommentSidebar() / toggleCommentSidebar() APIs. Learn more →
  • [Comments]: Reopening the V2 sidebar now starts fresh with no comment selected, while preserving expanded/collapsed groups. Learn more →
  • [Comments]: The Resolved quick filter is now additive — it reveals resolved comments on top of the visible statuses instead of switching to resolved-only. Learn more →
  • [Comments]: With dialog-selection="false", clicking a comment in the list emits commentClick only — no selection, inline expansion, or focused-thread view. Learn more →
  • [Comments]: embed-mode="false" now correctly means “not embedded” — previously any non-empty value enabled embed mode. Learn more →
  • [Core]: removeLocation() with no arguments now clears the current location instead of doing nothing.
  • [Comments]: Unknown filter keys passed to setCommentSidebarFilters() are now ignored instead of emptying the whole list.
  • [Comments]: The header funnel dropdown no longer renders when it has no sections to show. Learn more →
  • [Comments]: With client-provided data, quick-filter, category-filter, and data changes now emit commentSidebarDataUpdate with the filtered list. Learn more →
  • [Comments]: Selecting a comment whose pin is on a different page now navigates there, opens the sidebar, selects the comment, and scrolls to its pin. Learn more →
  • [Comments]: Restored filter state now syncs page pins immediately on load, so filtered-out comments no longer show pins. Learn more →
  • [Comments]: Comment dialog actions (reply, edit, delete, resolve, assign, attachments) now always act on the comment the dialog is currently showing, fixing stale-id actions in virtualized lists.
July 9, 2026

Bug Fixes

  • [Self-Hosting]: Internal update for GCP Full self-hosting.
July 8, 2026

Bug Fixes

  • [Core]: When you configure an auth proxy via proxyConfig.authHost in initConfig, Velt’s boot-time auth request now routes through your proxy host instead of bypassing it on page reload. No API or configuration changes are required. Learn more →
July 3, 2026

Bug Fixes

  • [Comments]: With page-mode="true", setLocation() now keeps every location group visible in the V2 sidebar (current expanded, others collapsed), and header Status counts reflect all comments. Learn more →
  • [Comments]: setLocation() now always re-expands the current location’s group in the V2 sidebar, while preserving other groups’ remembered collapse state.
  • [Comments]: The V2 sidebar navigation button now opens the correct comment in long, virtualized lists.
July 03, 2026

Bug Fixes

  • [Comments]: In Comment Sidebar V2 custom-actions mode, grouped rows now match V1 — the current page’s group shows the “(This page)” suffix, toggling a group flips only that group, and navigating between pages preserves rows and expansion state. Learn more →
  • [Comments]: The count-type='filter' badge and filterCommentsOnDom pin gate now reflect the filtered list from the sidebar’s first load, instead of briefly counting all annotations.
  • [Comments]: Sidebar free-text search now matches every comment and reply (not just the first comment) by text or author name, adds exact #N comment-number search, and no longer matches hidden HTML markup.
  • [Comments]: The sidebar Comment Type (Public/Private) filter now detects new-style private comments (visibilityConfig.type of restricted or organizationPrivate) in addition to legacy iam.accessMode: 'private', so Private/Public counts are correct.
  • [Comments]: Global hotkeys no longer fire while you type in the sidebar search input.
July 02, 2026
This release brings the Comment Sidebar V2 to parity with V1 across grouping, filtering, and counting.

Improvements

  • [Comments]: When grouped by location or document, the V2 sidebar now starts with only the current group expanded; explicit expand/collapse choices persist across reloads. Learn more →
  • [Comments]: The Status filter now starts with Open and In Progress statuses pre-selected on first load, matching V1’s setDefaultStatuses. Learn more →
  • [Comments]: setCommentSidebarFilters() now renders client filters as checked options in the filter panel, cleared by Reset. Learn more →

Bug Fixes

  • [Comments]: Name-only locations (setLocation({ locationName: 'Home' })) now scope sidebar grouping, filtering, page mode, and client filters.
  • [Comments]: People, Involved, Assigned, and Tagged filter options are now keyed by userId, so a person referenced by both userId and email no longer appears as two options.
  • [Comments]: With setSidebarButtonCountType('filter'), the sidebar-button badge now counts the actual filtered list, and the same list gates on-page pins when filterCommentsOnDom is enabled. Learn more →
  • [Comments]: Selecting “All” on the Status field or hitting Reset now reveals resolved comments, matching V1.
  • [Comments]: The default Priority section now shows a “Not set” bucket for comments with no priority, matching V1.
  • [Comments]: Client filters set via setCommentSidebarFilters() for fields not shown in the Main Filter panel (e.g. version) now filter the list.
  • [Comments]: The cross-field system-filters-operator (AND/OR) is now applied to the sidebar filter engine, including values set before initialization.
  • [Comments]: The V2 sidebar virtual-scroll list now clips wide rows instead of scrolling horizontally, matching V1’s layout.
June 30, 2026

New Features

  • [Comments]: New restrictTextSearchToAnchor prop and enableRestrictTextSearchToAnchor() / disableRestrictTextSearchToAnchor() methods to restrict a text comment’s highlight search to its original anchor element, with no wider fallback. Learn more →

Improvements

  • [Self-Hosting]: The fieldsToRemove allowlist now applies to reaction annotations, recorder annotations, and all activity feature types (previously only comments and custom activities). Learn more →
  • [Comments]: Explicitly selecting “Resolved” (or any terminal status) in the V2 sidebar status filter now surfaces those comments instead of hiding them by default. Learn more →

Bug Fixes

  • [Comments]: Text comments whose anchor text went stale now re-highlight via a wider fallback search instead of silently ghosting. Learn more →
  • [Comments]: V2 sidebar facet counts are now computed against the same boundaries as the visible list, so a non-zero count no longer filters the list to nothing when selected. Learn more →
  • [Types]: The @veltdev/types published entry chain is now type-only, so type-only symbols can no longer be accidentally imported as runtime values that resolve to undefined.
  • [Types]: Published element-model declarations are re-synced with the runtime SDK — corrected return types, removed stale aliases, and added missing Presence, Notification, Rewriter, and Recorder method declarations.
June 24, 2026
V2 comment sidebar events now flow through the unified commentElement.on() event bus, plus correctness fixes for comments, reactions, and notifications.

New Features

  • [Comments]: Four new comment events on the on() bus — sidebarOpen, sidebarClose, commentClick, and commentNavigationButtonClick. Subscribe via commentElement.on(...) or useCommentEventCallback(...). Learn more →

Improvements

  • [Comments]: V2 sidebar filter option counts are now absolute — they no longer shift as you apply search text or other filters. Learn more →
  • [Comments]: Visual fixes to the V2 sidebar filter dropdown — dark-mode icon color, checkbox alignment, and selected-row accent color. Learn more →

Bug Fixes

  • [Comments]: Recipients granted via enablePrivateMode({ type: 'restricted', userIds: [...] }) are no longer dropped when a new pin is submitted.
  • [Comments]: The reaction pin and reaction tool render correctly again inside the comment dialog thread card.
  • [Comments]: The default-mode V2 comment sidebar no longer reserves an invisible full-height block at its tag location.
  • [Notifications]: Custom notification data now resolves correctly for self-hosted data providers when document paths don’t carry an organization id.
June 23, 2026
First beta of the modular SDK. The public Velt browser API is fully backward compatible — existing browser integrations work unchanged.

New Features

  • [Core]: Modular SDK — each feature now loads as its own on-demand chunk. Pass featureAllowList at init (e.g. ['comment', 'presence']) to preload only the features you use; omit it to keep the existing behavior of preloading everything. Learn more →
  • [Core]: New preload<Feature>() methods (e.g. preloadComment()) to warm a feature chunk ahead of use, or to load tag-only features (userInvite, userRequest, videoPlayer). Learn more →