Skip to content

Release history

libredesk releases

Modern, open source, self-hosted customer support desk. Single binary app.

All releases

12 shown

No immediate action
v2.3.1 Mixed

Duplicate request fix + deps

Review required
v2.3.0 Mixed
Auth RBAC

Bulk actions + inline images + contact notes + WS

v2.2.1 New feature
Notable features
  • Conversation status categories (open, waiting, resolved) with correct behavior for custom statuses
  • Admin table search and virtualization for responsive performance with large datasets
  • Reply-To header configuration for email inboxes to route replies to different mailboxes
Full changelog

What's new

  • Conversation status categories - every status (built-in or custom) now belongs to one of three categories: open, waiting, or resolved. Categories tell the system how a status should behave: open statuses count toward an agent's active conversation total and respect team max-assignment limits. Previously this behavior was hard-coded to the built-in Resolved / Closed names, so custom statuses you created did not participate. Now any custom status you add behaves correctly based on the category you pick.
  • Search on admin tables - admin datatables now have a search box.
  • Virtualized admin tables - admin datatables only render visible rows, so they stay responsive on large lists.
  • New conversation created_at filter for views - with range support.
  • Reply-To on email inboxes - set a Reply-To address to route customer replies to a different mailbox than the SMTP From address.
  • Prompt to tag on reply - new inbox setting that nudges agents to add tags when replying, so categorization happens at the moment of context.
  • Configurable session lifetime - agent session duration can now be configured from config.toml instead of being fixed.

What's fixed

  • Resolved or closed conversations no longer reopen due to a stale snoozed_until.
  • SMTP pool wait timeout set on the inbox form was not persisting and silently fell back to the default; it now saves correctly.
  • Fixed a rare race where idle detection could overwrite an agent's away_manual or away_and_reassigning state.
  • Auto-assigner no longer stalls when the first picked agent is capped, and now handles teams with no agents.
  • Fixed incorrect avatar URL being saved for agents when using the S3 store.

Upgrade notes

  • Always take a database backup before upgrading.
  • Follow the steps here.

Changelog

  • feb23fae fix new inbox create dropping enabled/csat_enabled/secret/linked_email_inbox_id
  • bf69b56e fix prompt_tags_on_reply not persisting on email inbox creation
v2.2.0 Mixed

Skip this version and upgrade directly to v2.2.1.

Full changelog

Skip this version and upgrade to v2.2.1 directly

Changelog

  • be7369d6 Update widget unread count style
  • ea4f8d75 cap unread message count badge at 9+ since backend caps at 10
  • c3d1dbe5 Merge pull request #300 from abhinavxd/reply-to-addr
  • b06a5151 disable plus addressing toggle for microsoft inboxes instead of hiding, preventing accidental disable on re-save
  • 971ec49c enable datatable search on all admin tables, restrict global filter to text columns
  • ffa5a22f fix s3 avatar_url storing bucket path instead of /uploads/ Trim spaces around reply to config
  • dce33238 exclude inbox reply_to from reply recipients to prevent self-loop
  • 3d2da2a1 add reply_to on email inboxes for routing replies off the SMTP From domain
  • 38c14808 fix view greater/less than date filter including boundary-day rows
  • 85795708 fix inbox form binding wait_timeout to wrong key, never persisting SMTP pool wait timeout
  • 467a62b0 fix snoozed_until leak causing resolved/closed conversations to reopen
  • bfe7cef6 add global search to datatable with per-table opt-out
  • dd6c8f93 add conversation.subject_ref_format config for customizing outgoing email subject marker
  • 8ebd7d7e cap macro command palette list at 200 and scope highlight observer
  • 3ba8ab0a prevent idle detection from overwriting away_manual/away_and_reassigning
  • 627c4a7c Merge pull request #293 from abhinavxd/category-statuses
  • ed4bac61 return error on default status update instead of silent no-op
  • 10129495 Merge remote-tracking branch 'origin/main' into category-statuses
  • 2d3958fe Merge pull request #294 from abhinavxd/more-view-filters
  • 38a7fd69 update mig ver
  • b658df8d Extract LoadingOverlay component for admin spinner/dim pattern
  • bf63a873 use constants from filterConfig for operators.
  • db8d099e Prevent Enter key from submitting automation rule form
  • 15021bf2 Make session lifetime configurable
  • 06b36b74 Add prompt-to-tag-on-reply inbox setting
  • bcd93514 Fix caret overflow in ComboBox trigger for long labels
  • 66db129b Refetch conversations when the open view is edited
  • 68a587bc Remove filter value when operator changes from / to between
  • c16ad26d Add Range Calendar shadcn component for filters
  • 7aa48641 Fix spinner position in admin panels
  • 5bbd0f7c Increase default rate limits
  • 8090309e Fix autoassigner delaying conversation assignment when first picked agent is capped Handle cases where teams do not have any agents
  • 79dc693c Fix large tag names expanding outside tag badge
  • aa9e4cda feat: add conversation status categories and update related logic.
  • 1562f772 Update README.md
  • 8f5d80f6 Update README.md
  • 21cb6a25 Update README.md
  • 00785c60 WIP: More filters to views Virtualize agent list and tag list.
  • 30b596e1 Update ROADMAP.md
  • 088a5469 Update ROADMAP.md
  • 108d7a7c Merge pull request #285 from abhinavxd/dependabot/npm_and_yarn/frontend/qs-6.15.1
  • 0b7cfe2a Merge pull request #284 from abhinavxd/dependabot/npm_and_yarn/frontend/vite-6.4.2
  • 50ebcec3 build(deps): bump qs from 6.13.1 to 6.15.1 in /frontend
  • b4de085f build(deps-dev): bump vite from 5.4.21 to 6.4.2 in /frontend
  • 26bb17a5 Merge pull request #281 from abhinavxd/dependabot/npm_and_yarn/frontend/axios-1.15.0
  • f6b2162d build(deps): bump axios from 1.13.5 to 1.15.0 in /frontend
v2.1.1 Bug fix

Minor fixes and improvements.

Full changelog

What's fixed

  • Chat widget occasionally not appearing on page load when served from browser cache.

Upgrade

  • Always take a database backup before upgrading.
  • Follow the steps here.

Changelog

  • c645df82 Fix widget auto-init race when script is served from memory cache
  • e3b82f03 Update README.md
  • c0833550 Update ROADMAP.md
  • 212f0dd4 Update readme

Full Changelog: https://github.com/abhinavxd/libredesk/compare/v2.1.0...v2.1.1

v2.1.0 Breaking risk
Security fixes
  • Prevent stored XSS via SVG uploads
  • WebSocket same-origin enforcement and SameSite=Lax session cookie
  • Rate limiting, per-inbox trusted domains, and IP blocking
Notable features
  • Live chat widget (beta) with per-inbox branding and conversation continuity
  • Editable CSAT templates and embedded CSAT widget for customer ratings
  • External user ID field on contacts and bulk tag import from CSV
Full changelog

Libredesk v2.1.0 🚀

Libredesk is now omni-channel. Alongside email, you can drop a live chat widget onto your website and handle both channels from your Libredesk instance.

This release started as "just the live chat channel," but the refactoring opened the door to a handful of long-pending improvements shipping in the same cut.

Note: Documentation for the new features (live chat, context links, external user ID, custom static directory) is being updated and will land shortly.

Live chat widget (beta)

An embeddable chat widget you install with a small JavaScript snippet.

Demo it on the landing page (bottom-right corner) at https://libredesk.io/.

  • Visitors and contacts - Libredesk now has 3 user types in total: Agents, Contacts, and Visitors (new). Visitors are anonymous users who can chat without logging in. If a user is already logged in on your site, you can identify them to Libredesk by passing a JWT signed by your backend.
  • Conversation continuity - when a user (visitor or contact) goes offline, unread agent replies are batched into an email after a configurable delay. Their email reply lands back in the same conversation, so users can switch between the widget and email interchangeably.
  • Per-inbox branding - logo, brand name, primary color, dark mode, customizable launcher (position, color, spacing), home screen (solid / gradient / image background, announcements, external links), greeting / intro messages, notice banner, office hours, and pre-chat form.
  • Behavior controls - separate rules for anonymous visitors and identified users (identified via JWT): start-conversation button text, whether they can start conversations, whether multiple open conversations are allowed, and whether replies to closed conversations are permitted. Plus per-inbox toggles for file uploads, emoji picker, and opening the widget straight into the last conversation.
  • Security - rate limits, per-inbox trusted domains, blocked IPs, and configurable session duration.
  • i18n - widget UI auto-detects the browser language (from Libredesk's supported locales) with a configurable fallback for everything else.

After upgrading, create a live chat inbox (Admin → Inboxes → New) to see the full set of configuration options in the form.

Other notable changes

  • CSAT is one-shot - ratings can only be submitted once per conversation; the rating link expires after use.

  • CSAT widget - in addition to the existing standalone CSAT page, CSAT can now be embedded as a small widget you can drop into your own site or email, so customers can rate wherever it fits.

  • Editable CSAT email template - the CSAT rating-request email is no longer hard-coded; customize it from the Email Templates section like any other outgoing template.

  • Custom static directory - self-hosters can point Libredesk at a directory to override the CSAT rating page, web templates, JS, and CSS, so you can fully white-label the customer-facing bits.

  • Context links - admin-configurable sidebar links that deep-link into external tools (billing, CRM, internal dashboards), with contact identity (email, contact ID, external user ID) passed into the URL so the target lands on the right record.

  • Tag importer - bulk import tags from CSV instead of creating them one at a time.

  • No email on self-assignment - assigning a conversation to yourself no longer triggers a redundant assignment email.

  • i18n improvements - many non-English translation improvements.

  • Non-contact sender indicator - if a message comes from someone other than the conversation's contact (e.g. a CC'd person replying), an activity entry is logged so the agent clearly sees the sender isn't the original contact.

  • External user ID on contacts - new external_user_id field that stores the unique user ID from your system (not Libredesk's). It becomes the identity anchor for the contact and relaxes the one-contact-per-email rule only for contacts that have an external user ID: multiple such contacts can share an email as long as each has a distinct external_user_id. Contacts without an external user ID still must have a unique email.

  • Quality of life and hardening - new-message notification sound for agents, unread notification count in the browser tab title, fairer, oldest-first auto-assigner, online / offline indicator on the contact sidebar, a cleaner, more compact conversation list, and a broad round of security and stability fixes.

Upgrade notes

  • Always take a database backup before upgrading.
  • Follow the steps here.

Changelog

  • a14d1dd0 Merge pull request #114 from abhinavxd/feat/live-chat-channel
  • f7cbfb52 Hard widget endpoints
  • dfa98081 Consolidate widget iframe layout and honor prefers-reduced-motion
  • 02580021 Fix contact_email log field to unwrap null.String
  • 189162b6 Clear typing indicator when switching conversations
  • 785c989a Flatten continuity config into [conversation] as continuity_scan_interval
  • fdb5a507 Add 7-day TTL window on visitor-to-contact upgrade via continuity email reply
  • 00039191 Harden widget apis: strip agent emails, fix cross-inbox merge, and tighten auth Don't render svgs inline for s3.
  • 286d409a Cap lengths on JWT/form name/email and restrict JWT user_id to contact or visitor
  • a8a6a978 Prevent stored XSS via SVG uploads
  • d7d58beb Lock agent WS to same-origin and set SameSite=Lax on session cookie
  • 5e7575b0 Add inbox validation to conversation access control
  • de55a984 Set read limit for ws connections and handle panics in widget WS forwarder
  • fd0e871a Add max chat message length validation Use CSP headers to for trusted domains instead of referrer header checks. Update description for trusted domains
  • a55a3237 Make outer app label text muted
  • fa645481 Make outer app form labels muted
  • 6ef17eea Make widget /auth/exchange idempotent Prevent tokens sent twice from widget.js, send only once. Update doc strings & comments for clarity. Fix error handling
  • aceecd99 Lazy-load emoji picker swap to lighter lib later
  • 300e9b12 Drop widget secondary color and auto-derive primary foreground for text selection.
  • de8c825c Increase widget iframe and launcher shadow depth
  • ceb1022b Increase gap between title and description in contact block confirmation dialog
  • 3fb75fbd Make contact email matching deterministic and scope contact blocking to the email address
  • cd59a111 Update ROADMAP.md
  • 1db7f460 Extract BuildEmailThreadingHeaders to deduplicate email threading logic
  • d73a85ff Fix continuity email threading: remove self-reference, drop unused meta field, cap source ID limit
  • a644ab2e Scope offline status broadcasts by user type instead of broadcasting to all
  • c6107375 Centralize widget 401 handling in axios response interceptor, clear session and visitor cookies on expiry
  • 62e02118 Increase visitor default session TTL from 90 days to 180 days
  • 99daf4e8 DRY up widget inbox validation, use validateWidgetInbox middleware
  • 567e6cd6 Add csat field description, cast survey is now sent only once per conversation
  • 2d8daf2b Add "Choose channel" heading to new inbox page
  • 33a2a877 Fix secret handling in webhook and context link updates, allow clearing secrets
  • a56168cf Fix incorrect webhook unassigned event value, use sentence case for event labels
  • b66c7305 Clarify automation rules trigger scope, use sentence case for role permissions labels
  • 28bdb89e Update csat request email template Update csat webpage again..
  • c96253ae Update shared view form layout
  • 6146f281 Add inbox channel validation in create conversation request
  • 35e0884f Extract reusable PaginationBar component, add week i18n key
  • e8807594 add more snooze options in commnd box
  • e5c8b76d Remove extra margin from buttons with icons
  • 01f27c84 Auto focus on holiday name in BH form
  • 9f8ddc45 Set correct place holder for text editor in automation action
  • fa8d32a5 Fix emitter listener leaks, sidebar action button fixes. Auto focus on view form
  • 1ed6f9ce Fix infinite re-render crash when opening conversation sidebar
  • 8dae4d1f Increase trimmed last message length to 120 chars
  • 508e0a41 Fix missing border for single conversation in widget
  • 1cb6074b Sync widget isOpen state across all open/close paths
  • c5c6a6b5 Clamp launcher spacing to 0-200, extend home gradient behind first card
  • c98c87d4 Fix visitor own messages counted as unread; set waiting_since on new conversations
  • 882f6504 Stop broadcasting typing indicator between agents
  • b84c0210 use lightbulb icon for csat survey tip
  • 9d91bb86 Send only one CSAT per conversation
  • c15ac8e1 Update ArrowRight icon size in HomeView.vue
  • 9424db26 Fix continuity email re-sending same messages
  • 0d9196b2 Add color customization for live chat launcher
  • e860164a Add widget home screen customization with configurable backgrounds, announcements, and external links Fix inconsistnet close button for mobile devices.
  • 710746c1 restyle widget bottom nav tabs to vertical layout with larger tap targets
  • 6aea4c98 Removed the Stepper component and replaced it with a simpler MenuCard layout for channel selection in NewInbox.vue. - Introduced a new SwitchField component for better UI consistency. - Updated WebSocket client to remove unnecessary token and inbox_id from ping and typing messages. - Added session duration configuration to the livechat channel settings in the backend.
  • d804e365 Fix continuity email tracking to not reset contact_last_seen_at and exclude continuity messages from unread count
  • 66cf2173 dedupe page visits for widget
  • c798c676 Hide server-side security fields in chat settings response and adjust iframe border radius
  • dcf45fd1 Skip already attached media in new conversation api. Extract common logic for new message and convo api. New helper functions to fetch multiple medias in 1 shot
  • 7524ba6c Add support for custom attributes to createConversationRequest More polishes to notif panel Add You for current agent in select combobox. Remove unncesary checks for existing notifications while marking it as read. Send oldest SLA notifcation first (update sql query)
  • 588c3648 Include visitor name in chat init response Fixes for correctly conversations and messages Rename establishSession to saveSess
  • 64eb4e4c Fix widget greeting overflow with long names. Sync messages on every WS connect
  • f487950f Polish notification panel
  • edb65650 Fix incorrect unread message count when a continuity message is auto sent in conversation Remove dead widget code Add config.toml to goreleaser
  • 8846ede8 standardize project name to lowercase "libredesk" across documentation, UI, and codebase. Vue router console warning fixes
  • 0305feca Add csat uuid as available param to CSAT request template
  • fd750b8c Add tag importer with file similar to agent import. Update help text across many admin sections for clarity
  • a327ca69 Add new csat widget that just accepts
  • f6e099c6 Fix notification sound to only alert for new or hidden-tab conversations
  • 5b5b8372 Polish outer app login form layouts and improve email templates for consistency and clarity
  • ee26b623 Disable widget actions when message is being sent Fix widget input text area height
  • fa2d17ee Update conversation list item layout with channel indicator and improve SLA time format
  • 4c47dd85 Drop redundant overdue text from compact SLA badges in conversation list
  • bb14b301 Remove gravatar
  • de740245 Simplify custom static dir to single mapping that mirrors built-in static/ structure
  • 37269af9 Persist small screen overlay dismissal in session storage
  • 70f7b4f6 Add small screen overlay warning for agent dashboard on mobile devices
  • 88a58c0f Custom static directory support, self hosted installations can pass static dir path to override csat and other web-templates, js and css files. Allowing instances to be fully customizable.
  • cc332697 Update README.md
  • e7eac6eb Strip csat uui for agents (session) but keep for api consumers
  • bdaf9159 Add dynamic launcher size adjustment for mobile and desktop
  • 4315b09f Merge pull request #280 from abhinavxd/dependabot/go_modules/github.com/go-jose/go-jose/v4-4.1.4
  • 2436f15e build(deps): bump github.com/go-jose/go-jose/v4 from 4.0.5 to 4.1.4
  • dc6f9e38 Update ROADMAP.md
  • aaff1b14 assign oldest convos first in auto assigner
  • 14b29a70 Resolve inline image CID references in message API responses instead of letting the api consumer handle it.
  • f8c572c3 Update ROADMAP.md
  • bf791974 Fix widget updateLastSeen firing on pre-load, skip for cached convo re-open
  • eea99130 Defer widget launcher display until auth and conversation data are loaded
  • ceec9623 Debounce update-last-seen on tab switch, throttle idle detection goOnline
  • 3e18ce15 Polish sidebar page visits, make contact name linkable, fix redundant sync convo switch in widget on every tab change
  • 6dc2f1b1 Fix translations escape |
  • 3db51ec0 Fix consolidate duplicate i18n keys that have same values Polish csat page
  • 21824f6d Polish UI: fix reply box cutoff, refine scrollbars and text rendering
  • 54ecfb1c Fix own messages showing as unread in widget
  • 3c3d6a61 feat: replace widget JWT auth with Redis session tokens and parent-domain cookies Fix iOS Safari session loss by moving storage from iframe localStorage to first-party cookies. Add /auth/exchange, /auth/me endpoints for the same.
  • 235afb2b Play notification sound when tab is hidden and defer last-seen updates when tab is hidden Update js template rendered to use pipe syntax for fallbacks
  • 2839dcff Fix send typing indicators every 3 sec Fix vite config
  • 88bb199d Clear typing indicators after 5 sec
  • 20ff4a15 Sync msgs immediately once widget comes back online
  • a71432ef Sync missed messages on widget WS connect to fix automation replies not appearing
  • 154be058 Fix widget mobile view zooming in for ios as the msg input had text size < 16 px.
  • 5c29708c Fix iframe src url
  • 02f7c190 Move trusted domaisn check to middleware
  • 5367bafa fix chunking for widget app
  • 6abb6ad0 Move continuity config and intervals to live chat inbox form from toml. - Refactor widget.js. - Fix possible race conditions in inbox reload logic. - Reload only the updated inbox when an inbox is updated / created not all. - Retain last inbox while navigatin back from admin -> inbox
  • 87ab8f5c Fix sidebar user dropdown positioning and notification panel double-fetch
  • b34e5816 Skip redundant contact updates when JWT values unchanged
  • 73ea8741 Fix dev backend failing to start without the frontend being built.
  • 5a06a901 Revert minification step for widget.js in production build process as the widget js is already very small and is not needed now
  • 0a9e57dc Revamp live chat widget JS API, use inbox UUID, non-blocking installation Update installation instructions for clarity Remove unncessary convo custom attribs being passed in JWT tokens for live chat
  • 000fd83b Add uuid column to inboxes table to use as widget public identifiers Auto focus on form inputs in widget Use defer widget in widget installation script
  • 1118a6f4 Fix duplicate webhook events for conversations created via api
  • 090ea739 Update caniuse-lite browserslist database
  • b739783e Render reply and private not template variables before saving them in DB.
  • d590ace4 Fix typing indicator broadcast to exclude the sender by comparing client IDs
  • 9ce5f600 Fix widget business hours showing wrong time due to missing UTC offset
  • d0a35272 Sync contact name/email from JWT on every widget request
  • 9c436540 Add conversation ref number to list conversations api response
  • 65b17bd8 Merge pull request #276 from abhinavxd/dependabot/go_modules/golang.org/x/image-0.38.0
  • 33b1ddc5 build(deps): bump golang.org/x/image from 0.18.0 to 0.38.0
  • 9610c156 Simplify notification toggle check
  • 13db8d28 Fix command palette macros not working due to previous variable rename causing issues.
  • 2a8d4b3a Fix notification count in document title on navigation
  • 747d3ca7 Preserve notification count in document title on navigation
  • 3c00028c Fix gravatar not visible in convo list
  • d260eb56 Fix vue-i18n nested placeholder error in context link i18n strings
  • c8c39cd8 add phone country code to context link payload
  • b1bef238 Feat: context links, context links allow admins to set urls to external system from sidebar with encrypted payload in query parameters.
  • 18409589 Show default name and email fields in pre-chat form config
  • 71c8ec88 Remove unused WS unsubscribe functions
  • 7d8c2d9f Check conversation ownership before broadcasting typing event on conversations
  • 9ae8100e Use widget upload API response directly instead of refetchign entire conversation Return ChatMessage format in upload api Fix scroll on content replace
  • 5f6ca63d Refactor use already fetched inbox config and set it in ctx for widget handlers
  • 114656e6 required jwt fields middleware for user
  • d02e0418 Expose IsContinuityEmail flag to email templates for conditional rendering
  • 5590ae6a Create contact from JWT in widget middleware for visitor merge, fix message input focus and pending cleanup
  • faa23967 Focus back on text area once widget message is sent Sign pending avatar urls
  • fb3ab68e Sign avatar URLs in widget WS broadcasts, add CORS for launcher settings
  • 2d64cfcc Skip conversation access check for unattached media
  • c06311b9 Rename AdminPageWithHelp to AdminSplitLayout
  • ed9b97f1 Polish message bubble envelope
  • 789a58ed Add echo_id for pending message matching, show ext_id in contact search, minor UI polish
  • a84d6aa0 Update continuity config defaults
  • e942e517 Fix report overview sql
  • 0b5fa468 Simplify mig query
  • b4b4c809 Fix Reply-To double-set: caller-provided takes priority over inbox-level plus-addressing
  • 653266c6 Remove unused readme file Remove participant tooltip for message bubbler as activity log takes care of it Fix create sender before creating conversation
  • 11eb4d0e Translate remaining hardcoded eng strings.
  • c59ce4ec Fix overview counts query: cast enum to text for COALESCE
  • 8a1ac870 Fix race condition in livechat Send: hold RLock during client iteration
  • eb94f2b0 Refactor widget WS: fix concurrent writes Update merge visitor to contact query to include other tables Update default for continuity email config
  • 52995d1c remove cache control headers for widget js file
  • 565732c5 add rate limit to show csat page
  • 42f5a7fa Show ext id in contact list
  • ea0443e8 Fix contact detail: consistent text-xs font size, add icons for external ID and created date
  • c8b71773 Add isNewConversation param to CreateContactMessage, cap page size to 500
  • 2b645fa4 Security fixes: rate-limit widget endpoints, remove JWT from logs, harden middleware checks Increase max page size to 500 Allow large out of bound page sizes by overriding to maximum set. Reset websocket reconnect attempts when widget is back online
  • 6a7ecf6b Resolve sender using conversation context, show ext_id on contact detail
  • 2f81d60a Widget: larger prechat textarea, check email for participant activity, fix notification sound
  • a67f14ce Play notification sound only on messages from agents
  • b04d9d6f Sign all avatar URLs in widget endpoints and WS broadcasts
  • 3b482e37 Fix widget: re-fetch convos on JWT set, prevent double conversation creation
  • 6ae73eef Check meta.from vs contact email for participant indicator
  • 1a148bd8 Show unread notification count in browser tab title
  • 975b996a fix: remove duplicate useI18n declaration
  • c3f0b183 Add participant activity note and visual indicator for non-contact senders
  • 1d36ddde Make first name mandatory for live chat jwt
  • 4e0f781b enrich exit only if not already set
  • 13447009 Remove insecure ref number matching, relax email constraint for ext_id contacts
  • 23e6a708 Allow contacts with different external_user_ids to share email, add enrichment and remove email check from conversation matching
  • b8519b90 Fix frontend build warnings: modern Sass API, split codemirror chunk.
  • 14a7bf44 Add widget.js minification step to build; subtle shadows.
  • c0575602 Sync prechat form labels with custom attributes; hide stale messages during chat load.
  • 2233712f Polish widget UX: accessibility, tab nav, expand/collapse, conversation list, and mobile fixes.
  • 8b556d95 Polish auth pages, contact detail, and avatar upload UX.
  • 64ffd558 Polish automation UI: theme-aware colors, accessibility, and cleanup.
  • 969b5be9 Fix mention styling in messages, improve notification panel UX
  • 8fd05667 Improve sidebar semantics, form label hierarchy, and translate remaining hardcoded strings
  • 9652c6d4 Clean up i18n keys, sort language files, and refactor admin UI components.
  • 802987dc Reorder livechat inbox form fields; show reply expectation message when agent is offline during business hours
  • 395a4e80 Refactor ws updates to use direct json payloads instead of prop value pattern.
  • f2660215 Fix widget unread badge not restoring when chat is closed
  • da2a706a Don't show widget launcher until conversation data is loaded. Hide widget on fatal errors (expired JWT, server errors, init failures).
  • 48175300 Add rate limiting to public endpoints (auth, CSAT), fix rate limiter race condition and missing Content-Type header. Refactor rateLimitWidget into generic rateLimit middleware with config defaults.
  • bcd0ed4f Show conversation status in search results
  • 34aecd26 Fix widget business hours: use assigned team hours instead of always defaulting, fix timezone offset calculation. Show continuity email indicator in agent UI, broadcast email replies to widget as a user could have widget open and reply from email at the same time.
  • a7885531 Use first unread message as subject for continuity emails, add ref number to continuity email subject. - Continuity email layout fixes and improvments. - Replace haikunator with email local part for visitor names, fallback to "Visitor" - Add optional website_url config field for "go to chat" link in continuity email footer - Remove unused / unncessary i18n keys.
  • b0f02159 Fix attachment previews in pending messages - Fix ci
  • b8e23671 Merge branch 'main' into feat/live-chat-channel
  • e7ab571c add reply guards, gravatar fallbacks for avatars, draft preview in conversation list, clickable agent avatars. Show sent messages immediately instead of waiting for WebSocket response.
  • 67823902 Refactor incoming message flow, add visitor upgrade on email reply, rate-limit livechat conversations
  • eb0a7b43 Add page visit tracking to widget - fix duplicate initialization guard - notification bell for agents - Refactor and clean up dead code - Fixes to pre chat form - Add new column country to users table - Update ratelimit pkg to be generic
  • 384dad02 Update README.md
  • b277b30c Create issues.yml
  • 36e2bd97 Create issues.yml
  • 68ed6b2d Update ROADMAP.md
  • 0a662b08 Add widget js API (hideDefaultLauncher, setUser, logout), fix static methods, update installation tab
  • 18764cb5 Redact websocket message content and let clients fetch the full message once they receive this event, this will make sure a client actually has permission to fetch that message.
  • 0b7c8164 Allow live chat widgets to detect lang from user browser and fallback to defaults set by admin. New handler to return all available langs, remove hardcoded langs
  • 45a80118 Fix CSAT responses not visible agent message bubble - Fix csat form submission in widget - Update vite config to allow cross origin requests
  • aeb153b1 fix: message meta not being saved
  • 53181af6 Merge branch 'main' into feat/live-chat-channel
  • 131d32e3 Translate search result tabs - Translate sort options - Correct button size in ProfileEditView
  • 4eb5dce1 Merge branch 'main' into feat/live-chat-channel
  • 81847c7f i18n: fix localization issues (#231) Not backported to main due to extensive i18n refactoring changes in this branch.
  • 206af8a9 refactor move common utils to shared-ui
  • c21adfdf refactor: move datetime utility functions to shared-ui and update imports
  • 7b7629d6 Merge branch 'main' into feat/live-chat-channel
  • c155fce9 feat: show contact offline / online status on sidebar - mark contacts offline if not active for > 5 mins.
  • 70e6ebcc feat(widget): merge visitor to contact when new JWT is available i.e. when user logs into a an external system. - Prevent file uploads on initial message, user send a message first to enable attachments. - fix thumbs not loading with signature and expiry
  • 8bdc30e6 rename components to reflect purpose
  • acc94e8f feat(livechat): show author name in conversation list
  • eb5cae59 feat(widget): add audio notification for new messages
  • ae12d3eb more fixes
  • a94c3846 more fixes
  • f0e9266d more fixes to LC
  • 0aa4cada refactor(sidebar): improve layout and styling of sidebar components, remove unnecessary padding around chil sidebar items
  • 107f1adb fix issues with threading with widget messages - fix: live chat email inbox not being initialized. - make launcher logo take entire launcher space. - New columns last_interaction_sender_id and last_message_sender_id to track who sent last message in conversation
  • 8ebe77a5 - Fix copy button component usage - Set --primary color value correct in live chat widget.
  • e2a9a002 Live chat: add admin toggle to open widget directly into previous conversation / a new conversation
  • 511f4644 fix merge conflict issues
  • 4d25ae73 reduce the number of fetched conversation messages from 1000 to 400 for livechat
  • 08acb099 fix build
  • 2421b964 fix merge conflcits
  • 7958d7e2 Merge branch 'main' into feat/live-chat-channel
  • 7217086f add instructions for authenticated users for live chat widget
  • 98b3b54b Add installation tab to live chat form for copying widget js snippet
  • aae8d1f7 Consider visitors and contacts same, as the only difference is that visitors are not authenticated. Show a warning in sidebar when a conversation with a visitor is opened.
  • 7858a949 add missing error check
  • 95ae55da add missing comma in get-contact-chat-conversations query
  • 0dedc0b6 remove missing query from queries struct
  • 0f207a0c remove missing query from query map
  • 6840f73b fix component imports
  • bf1cf025 Merge branch 'main' into feat/live-chat-channel
  • 4a1e7af2 do not sending typing ws message to widget clients if it's a private message being typed by agent
  • 9c43b885 hide live chat continuity emails in AgentMessageBubble
  • a4b5340a move file system media url secret and expiry duration to fs.go
  • f7e243f3 update fetchMessageAttachments to use signed URLs for media attachments with a 4-hour expiration
  • 16ca6b6d Send batched unread messages in conversation continuity email after contact has not seen a conversation for configured amount of time, instead of sending a single message immediately when contact is disconnected on websocket.
  • 1de54fe1 add network connection banner in live chat widget
  • 54e61442 refactor and fixes to convo continuity
  • 1deeaf6d remove unnecessary descriptions for fields and translations
  • 3a599017 fixes to pre chat form
  • c7291b1d fix layout for live chat inbox tabs for smaller devices hide admin help text on smaller devices
  • 5de870c4 Config option to show or hide ‘Powered by Libredesk’ in the live chat widget. Make the start conversation button a floating button and add a gradient fade overlay
  • d7067bce feat: add email fallback / continutiy inbox feature for live chat inbox
  • ed448055 fix: newly created conversation not being added to the conversation list, simplify chat conversation SQL queries. - add indexes to make conversation unread message count faster
  • c721d19b fix migration
  • 77111835 fix component import
  • 45a77b14 fix build
  • 9a77c895 Merge branch 'main' into feat/live-chat-channel
  • 18d4a8fe feat: auto-remove pending outgoing widget messages after 10 seconds if they have a temporary ID
  • a2234e90 make widget expand to full viewport height update shadows for iframe and widget
  • d7fe6153 Center pre chat form title
  • 68c27084 feat: remove VisitorInfoForm component and integrate customizable pre-chat form.
  • 4f9fc029 show uploading state when file is being uploaded from widget
  • 6cfa9383 fix: remove unnecessary filter from default icon styling in widget
  • f72f158c - show thumbnail image in widget thread instead of the entire image - update file imports to use shared-ui utils and remove redundant file.js - Implement SignedURLStore interface for fs store
  • 1962abdc feat: implement rate limiting for public widget endpoints with Redis support
  • 081a5c61 fix: update main.js to import styles from shared-ui instead
  • c35ab42b feat: configurable visitor information collection with a form before starting chat.
  • f05014f4 refactor: implement widget authentication middleware with standard HTTP headers
  • e2bba046 Fix: Trusted domain validation for live chat widget, check the referrer header instead of origin.
  • 4beab72a feat: add external user ID support and secret field for inboxes. Update user and inbox models, queries, and migrations
  • 26b3b30f feat: add authenticated user support by passing JWT from parent to widget iframe.
  • 11fd57ad update lucide-vue-next to version 0.525.0
  • d4f644c5 feat translate widget app
  • 646bbc7e wait for widget vue app to be ready before showing the widget icon - show arrow down when when widget is open
  • 3c370955 feat: Add loading indicators to chat components and improve spinner UI
  • 74732bfe feat: Add expand/collapse functionality to chat view
  • 8ee81c2d feat: Widget dark mode and chat reply expectation message in chat title.
  • 282dc834 fix set correct var name
  • 61a70f6b clean up live chat move last message details in the meta JSONB column of conversations
  • 5b6a58fb wip: intercom like live chat with chat widget - new vue app for serving live chat widget, created subdirectories inside frontend dir main and widget - vite changes for both main app and widget app. - new backend live chat channel - apis for live chat widget
v1.0.3 Bug fix

Fixed WebSocket permission errors for restricted agents and restricted message retries to sender only

v1.0.2 New feature
Security fixes
  • SSRF protection for webhooks with CIDR range allowlist
Notable features
  • Conversation subject in list view
v0.11.1-beta Bug fix

Fixed whitespace trimming in form fields and resolved Redis session key expiration with 9-hour TTL

v0.11.0-beta New feature
Notable features
  • Notifications with mentions and email alerts
  • Bulk agent import via CSV
  • Signed URLs for media access

Beta — feedback welcome: [email protected]