Libredesk v2.3.0
Bulk actions on conversations, a inline-image in editor, contact notes in the sidebar, and a stack of email rendering fixes.
What's new
- Bulk actions on conversations - select multiple conversations to assign, change status, or set tags.
- Inline images - paste images, resize them in the editor.
- Image viewer - images no longer open in new tab instead they open in an image viewer / gallery.
- Contact notes in conversation sidebar - view and add a contact's notes without leaving the conversation.
- Cleaner message thread - long messages get an expand button to keep the chat short, and consecutive messages from the same sender are grouped.
- Attachment previews - improved attachments preview.
- Audio attachments - play audio files inline with a built-in popover player.
- Inbox name in the conversation sidebar - see which inbox a conversation came in through.
- Improved notification sound - plays only when the tab isn't focused, like WhatsApp.
- Translations - added Portuguese (Brazil) (pt-BR) and Chinese (Simplified) (zh-CN) translations.
- Live chat widget - Improved connection status banner to show more granular states such as Connecting, Connected, and Reconnecting.
What's fixed
- Quoted text hidden correctly for Outlook, Gmail, and Yahoo replies.
- Auto-reply and CSAT no longer fan out to the original CC list and instead only go to the sender.
- Encryption key rotation no longer fatal on boot.
- Security fix: message lookups are now scoped to the parent conversation.
- WebSocket overhaul - lower CPU, memory usage per connection and improved syncing during a re-connection.
- Search results now respect conversation read permissions, and the search box auto-focuses when opened.
And many quality of life fixes and improvements..
Upgrade notes
- Always take a database backup before upgrading.
- Follow the steps here.
Changelog
- d36c43c ci: pin pnpm to 9.15.3 and bump release node to 20
- d173688 Merge pull request #346 from abhinavxd/fix-invalid-utf-8
- 1233f2f fix: migrate livechat inbox lang codes to region format
- c87c60b fix: drop contact email from incoming-message error log to keep PII out of logs
- 870f66c fix: sanitize invalid UTF-8 in incoming email, fix widget scroll flicker
- 4bfb90b Merge pull request #345 from abhinavxd/fix-mention-scroll
- 67ecf3a fix: keep the mentioned message in view when long messages collapse
- f331b3c Merge pull request #342 from jleroy/i18n/update-2026-05-26
- 1915094 Fix globals.terms.slaMetric key in ja-JP.json
- 92ccdca Add security.md
- c8a5717 fix: filter search results by conversation read permission Auto focus on search input Trim search responses to 200 chars as more's not needed.
- a318b52 Update translations [2025-05-26]
- 5594cce Merge pull request #341 from abhinavxd/widget-ws-improvements
- 9159c26 fix: clean up widget ws state on close and announce banner to screen readers
- bba99d4 fix: show typing indicator on scroll, hide view transition abort errors
- 9480e98 Merge pull request #336 from abhinavxd/adhoc-patch-1
- 5538c85 refactor and dedup code: share conversation read-permission check across authz and ws
- 29881f2 fix: close ws stale-perm gaps and resub on reconnect
- 74e2213 fix: auto-resub list when conv uuids change
- c87266f Skip ws converstion broadcast when agent is disabled
- ddc82d9 fix: extract text from malformed email HTML
- 4f70779 Move pvt method below public
- 743b00e fix: address PR review across stores, ws broadcast, and sticky scroll
- 5dfefab fix: guard previous_conversations loop against nullish current
- a0851bc fix: show typing indicator on scroll, hide view transition abort errors
- 8faf06e fix: reliably sync widget missed messages on reconnect Update connection status banner to show more intermediate connection statuses like connecting.. and connected.
- b65d967 fix: scroll to target message on scrollTo deep-link instead of bottom
- 0654e3b fix: skip empty incoming attachments; assign team/agent before running post message hooks this allows automations to see the conversations assigned agent & team.
- f581492 refactor: dedupe overview report fetch/handler boilerplate
- 214cc60 fix: derive conversation list link context from route params, not name substring
- eb4e49a fix: gate mark-as-read by route, clear stale lastInboxPath on load
- 9f09d8c fix: dedupe parallel custom-attribute fetch, cache AI prompts in store
- cd8eb5e perf: keep-alive inbox layout to skip refetch on admin round-trip
- e5ffe11 Fix edge cases in auto scrolling behavior. Extract sticky scroller to a composable for main & widget apps.
- 0a0500f refactor: fold widget availability broadcast into BroadcastAgentAvailability
- 92fe4f4 tweak: scope conv list refresh interval to InboxView, bump to 2m
- 2874e78 fix: mark-unread no-op when latest message is a continuity email
- 4f7a23e Merge pull request #338 from abhinavxd/dependabot/npm_and_yarn/frontend/qs-6.15.2
- bd21532 build(deps): bump qs from 6.14.2 to 6.15.2 in /frontend
- ad089fc fix: hide conv list items while skeleton is visible
- e4fae78 tweak: bump skeleton minVisibleMs 300 -> 500ms
- 46d5680 fix: skeleton not showing on slow network - View Transition was freezing render
- 183c83b fix: prod crash from private methods, plus PR #336 review fixes
- a502039 perf: WS push for conv list, store/cache cleanups, ad-hoc UI polish
- aa972d5 Merge pull request #334 from abhinavxd/dependabot/npm_and_yarn/frontend/yaml-2.9.0
- 735f5da build(deps): bump yaml from 2.7.1 to 2.9.0 in /frontend
- ba64f55 Merge pull request #333 from abhinavxd/perf-optimizations-2
- ee4ddae fix: log team-member fetch errors during cache invalidation
- edc82e9 refactor: drop Casbin, centralize agent cache invalidation, dedupe pending SLAs
- 33572ef fix: address WS PR review - stale cache retry, livechat buffer, last_active TOCTOU
- 7a8efcd fix: widget ping interval, last_active flush, ws ping error, slim new_message payload
- 43ebed1 WS rewrite: per-client subscriptions and perf improvements
- 68d6394 Merge pull request #332 from abhinavxd/fix-attch-download-for-s3
- 2b6fd31 fix: S3 attachment URLs and missed conversation list updates
- 68d1b81 fix: attachment download through backend for S3 stores
- 35d5f1b Merge pull request #330 from abhinavxd/fix/yahoo-quoted-text
- 9dfcb6b fix: hide Gmail forward quoted text
- c03477a fix: hide Yahoo Mail quoted text
- 10b0d81 Merge pull request #329 from abhinavxd/feat-show-inbox-name
- 1607997 feat: show inbox name in conversation sidebar
- 6bc3698 Merge pull request #328 from abhinavxd/hotfix-media-empty-uuid-cast
- 4e13e72 fix: harden media + conversation queries against empty-uuid casts
- df1d581 fix: show "1 selected" in conversation bulk action toolbar
- 5f0fed6 fix: make CSAT template insert idempotent in v2.0.0 migration
- a6c8628 Merge pull request #320 from csr4422/feat/contact-notes-conversation-sidebar
- 15ca569 fix: skip stale toasts and invalidate in-flight fetches on contact reset
- 259b2ab fix: gate contact notes sidebar by read perm and add bottom padding to contact page
- a59f40e fix: prevent out-of-order responses in contact notes fetch
- fd21560 feat: limit contact notes to 10 with view more button
- 860527a fix: reduce spacing in contact notes component
- 444530b i18n: add contact notes key for conversation sidebar
- b2a2fc3 fix: refetch notes on contact change in conversation sidebar
- 82b419d feat: add contact notes accordion section to conversation sidebar
- d96a37d Merge pull request #327 from abhinavxd/perf/conversation-store
- b15c776 update migration to version 2.3.0
- 41ef3fe fix conversation list fetch races and scope notification sound to current list and only play when tab is not open like whatsapp. Remove unused fetch participants API. Fix incorrect default language in schema.sql Show correct draft preview when text editor only has
- 4c63152 Rename migration file v2.2.2 to v2.3.0
- bbc8e55 Merge pull request #318 from jleroy/bugfix/i18n-keys-2026-04-18
- 63e28af Update en translation
- 7cf476b Fix some translations issues: - Rename activityLog.type* keys used in activity log filter to activityLog.entryType* for more clarity - Rename actions.sendPrivateNote key to actions.addPrivateNote as note aren't sent out - Fix automations rulebox template to use component interpolation instead of multiple separate strings - Fix some source translations
- adeb76c shrink conversation list page size and slow down conversation list refresh and participant fetches
- c85cb90 Merge pull request #317 from jleroy/i18n/update-2026-05-15
- ac597c4 Update ROADMAP.md
- bddca7e Update ROADMAP.md
- 44186f7 Update pt-BR localization
- 06d1c39 Migration (v2.2.2): Remove unused "fmt" import
- a6f5815 Fix translations issues
- fdf897c Migration (v2.2.2): Use parameterized queries to prevent SQL injection patterns
- d482267 Make browser language detection keep the full locale, including region code
- 3c3c845 Crowdin: Fix source language filename
- 06a9b0b Merge pull request #326 from abhinavxd/dependabot/npm_and_yarn/frontend/js-yaml-4.1.1
- fc6a875 Merge pull request #325 from abhinavxd/dependabot/npm_and_yarn/frontend/glob-10.5.0
- 48edf5a build(deps): bump js-yaml from 4.1.0 to 4.1.1 in /frontend
- aac466a build(deps): bump glob from 10.4.5 to 10.5.0 in /frontend
- abf6f43 Merge pull request #324 from abhinavxd/dependabot/npm_and_yarn/frontend/minimatch-9.0.9
- c598074 Merge pull request #323 from abhinavxd/dependabot/npm_and_yarn/frontend/flatted-3.4.2
- 558f85b build(deps): bump minimatch from 3.1.2 to 9.0.9 in /frontend
- 923525c build(deps): bump flatted from 3.3.2 to 3.4.2 in /frontend
- 7b1256a bump frontend deps and tighten image upload validation
- f826225 Remove description requirement from most admin forms Fixes #292
- bae4c23 hide outlook/hotmail quoted text correctly and fix html email whitespace
- e048ba5 improve conversation thread and inbox list ux
- 66d8c35 fall back to image preview for inline-image-only messages
- 8a82403 ship config.sample.toml in release archives instead of config.toml
- b014d0d resolve inline image cids on send-message response, revert f841a81
- f841a81 skip cid rewrite for private notes
- f5eb1d1 Merge pull request #310 from abhinavxd/fix/auto-reply-contact-only
- b5000c7 skip auto-reply and csat send when contact has no email
- f6a4ad5 fix auto-replies and csat fanning out to last message's cc list
- c1f80d9 Fix: persist drafts with inline-only images Increase orphan media GC duration to 7 days as some drafts might need them
- 41b5a7d Fix varible assignment
- e78f682 Fix missing import
- e0f362c Migrate DB to the new locale format
- 64ccdea Set frontend default locales to "en-US"
- b6dd5f0 Merge pull request #316 from abhinavxd/fix/key-rotation
- 8283b4e Update languages codes to include regions names and set default language to "en-US"
- 3e1c647 Scope encryption_key rotation fix to boot path
- 9410707 Merge pull request #315 from abhinavxd/fix/quoted-inline-dedup
- da3bdb2 Update translations [2025-05-15] and add regions names in languages filenames
- 0abd96f Fix quoted image resolution
- 7c949e6 Don't fatal on encryption_key rotation
- 793c3d2 Fix quoted-reply inline images returning no signed URL
- dbf4d3a Fix inline image media not linking on S3 presigned URLs Also simplify the inline-image helpers: one matcher plus stringutil.ExtractUUID, instead of two combined regexes with offset math.
- 3470347 Throttle conversation list refresh and keep list on fetch errors
- d1c346d Style toasts with theme instead of rich colors
- 74dd2f9 Merge pull request #286 from mageaustralia/feat/bulk-actions
- 4ca99b3 Centralize conversation tag updates in store
- 123b809 Address review feedback on bulk actions
- 863ac68 Add bulk actions on conversations (assign, status, priority)
- 8ae98de Merge pull request #289 from mageaustralia/feat/image-attachment-ux
- 475667e Render audio attachments as tiles with inline popover player
- 534771e Save inline image cid refs instead of urls in DB to survive url expiry
- 14b8ceb Remove obvious comments
- 9c2483a Harden attachment paths: drop PDF iframe, noopener/noreferrer everywhere, rename components so they don't confuse me anymore.
- 0be4a48 Generate thumbnails for extensionless images with magic byte detection
- b72dad7 Swap lightbox to lib, force-download via query param, link inline media on insert
- 878506b Sync i18n with English fallback, trim MessageBubble comments
- 4ab1885 Harden inline image embed
- 98e04e7 Tighten image attachment UX: composable, lightbox a11y, send gates, tests
- ae521e0 Translate image toolbar labels, fix Best fit and Small
- 35bdf02 Drop replaceCIDInContent, keep PR scoped to image resize UX
- acda125 Refactor inline images PR for project conventions
- b96a9c5 Inline images, lightbox, and attachment UX
- f407451 Merge pull request #309 from abhinavxd/dependabot/npm_and_yarn/frontend/postcss-8.5.10
- 13c690e build(deps-dev): bump postcss from 8.4.49 to 8.5.10 in /frontend
- 338eaa0 Merge pull request #308 from abhinavxd/dependabot/npm_and_yarn/frontend/axios-1.15.2
- 74189f8 reduce websocket message channel buffer size from 10000 to 256
- ab05d6a fix ws client leak when conn dies between ping writes
- ac5941c Update ROADMAP.md
- f1b81f4 build(deps): bump axios from 1.15.0 to 1.15.2 in /frontend
- d821cca Update ROADMAP.md
- e7362a9 Update ROADMAP.md
What's Changed (Auto generated)
- build(deps): bump axios from 1.15.0 to 1.15.2 in /frontend by @dependabot[bot] in #308
- build(deps-dev): bump postcss from 8.4.49 to 8.5.10 in /frontend by @dependabot[bot] in #309
- Inline images, lightbox, and attachment UX by @mageaustralia in #289
- Add bulk actions on conversations (assign, status, priority) by @mageaustralia in #286
- Fix quoted reply inline images returning no signed URL by @abhinavxd in #315
- Don't fatal on encryption_key rotation by @abhinavxd in #316
- fix auto-replies and csat fanning out to last message's cc list by @abhinavxd in #310
- build(deps): bump flatted from 3.3.2 to 3.4.2 in /frontend by @dependabot[bot] in #323
- build(deps): bump minimatch from 3.1.2 to 9.0.9 in /frontend by @dependabot[bot] in #324
- build(deps): bump glob from 10.4.5 to 10.5.0 in /frontend by @dependabot[bot] in #325
- build(deps): bump js-yaml from 4.1.0 to 4.1.1 in /frontend by @dependabot[bot] in #326
- Update translations [2026-05-15] and add regions names in languages filenames by @jleroy in #317
- Fix some minor translations-related issues by @jleroy in #318
- Perf/conversation store by @abhinavxd in #327
- Add contact notes to conversation sidebar by @csr4422 in #320
- fix: harden media + conversation queries against empty-uuid casts by @abhinavxd in #328
- feat: show inbox name in conversation sidebar by @abhinavxd in #329
- fix: hide Yahoo + Gmail forward quoted text. by @abhinavxd in #330
- fix: S3 attachment URLs and missed conversation list updates by @abhinavxd in #332
- WS rewrite: per-client subscriptions and perf improvements by @abhinavxd in #333
- build(deps): bump yaml from 2.7.1 to 2.9.0 in /frontend by @dependabot[bot] in #334
- build(deps): bump qs from 6.14.2 to 6.15.2 in /frontend by @dependabot[bot] in #338
- perf: WS push for conv list, store/cache cleanups, ad-hoc UI polish, adhoc fixes. by @abhinavxd in #336
- fix: reliably sync widget missed messages on reconnect by @abhinavxd in #341
- Update translations [2025-05-26] by @jleroy in #342
- fix: keep the mentioned message in view when long messages collapse by @abhinavxd in #345
- fix: sanitize invalid UTF-8 in incoming email by @abhinavxd in #346
Full Changelog: v2.2.1...v2.3.0