Mirror live/snapshot address shape in CartItem2 and DraftOrderItem types
CartItem2 gains **************** and shippingAddress/billingAddress fields populated from the customer's primary shipping/billing AccountAddress profile. DraftO...
/account/new copy-from-lead UX, full name fields, dual phones, address; account-level address management
Frontend: - /account/new: per-section "Copy from Lead" buttons + header "Copy all from Lead" button (when leadId param) - Name section: prefix, first, middle, l...
Production-grade History + Voicemail tabs with media-player tool
History tab (SoftphoneHistoryTab.tsx): - Infinite scroll via IntersectionObserver inside the panel's scroll container - Filter chips: All / Inbound / Outbound /...
Remove redundant Field history title from history panel
Tab label already conveys context — title and subtitle were wasting screen space. Reload button moved inline into the toolbar.
Remove layout prop causing email body bouncing
The outer motion.div's `layout` prop fought with the inner AnimatePresence height: 'auto' animation, creating a FLIP feedback loop on emails with unstable heigh...
Add History tab — paginated audit timeline with search and filters
- LeadHistoryPanel: sticky filter toolbar with debounced search, **************** filters, MUI table with pagination, color-coded event chips, member-name resol...
Add lead-account assignment UI, currency system, assign/new account pages, settings currency field
Dynamic member type label in My Account page title
Title now reads "My {Member|Team Member} Account" using the org-configured behavior labels, switching automatically once the member's type is loaded.
Move Create Document button into DocManager toolbar
The button was only available on /doc/manager via the actions prop. Moved all logic (state, handler, DOC_TYPES, menu) into DocManager so it appears on every emb...
Always show Create Document button on doc manager page
Removed the getMemberId() > 0 guard that was hiding the button during the useUserInfo loading window. The page is already behind auth so no client-side membersh...
Move Mailing Address into 3-column row with Lead Info and Primary Contact
Restore organization import removed by accident
organization.id is still needed in the handleCreateDocument request body; only the isDocsEditor condition should have been removed.
Show Create Document button to all logged-in members
The org feature flag check (isDocsEditor → isDocs → hasFeature DOCS) was returning false because org features use deprecated key types. The button is now shown ...
International support — CountrySelect, LanguageSelect, SubdivisionField across all forms
- Add reusable CountrySelect (207 countries, flag icons), LanguageSelect (26 languages, flag icons), SubdivisionField (US state dropdown with flags; other cou...
Remove datagrid field-level filters and floating filter row
Disabled all column filters and the floating filter input row so the grid shows only column headers and data rows. Also removed the Filters tool panel from the ...
Move Upload button into DocManager toolbar
The Upload trigger was only in the /doc/manager page's actions prop, making it invisible when DocManager is embedded in other pages. Moved the Upload button dir...
Allow upload options to scroll in embedded DocManager
Uploads tab container was overflow:hidden, clipping per-file options (description, folder, doc type, access level) in height-constrained embedded contexts. Chan...
Fix 400 feed error and add communications sub-tabs with URL params
Fix double-? bug in MediaStream where feedEndpoint already contained query params but the fetch appended ?page=... instead of &page=..., causing a malformed URL...
Make 'All Leads' a real menu item with icons in agent filter
- Replace placeholder empty-value item with __ALL__ so the dropdown never shows blank when All Leads is selected - Add Group icon to All Leads and PersonOff i...
ASSIGN_LEADS right, agent filter unassigned option, grid column cleanup
- Gate 'Unassigned Leads' agent filter option behind ASSIGN_LEADS right - 'All Leads' excludes unassigned leads for members without the right - Remove Street, P...
Add Assign To field to Market & Assignment section on /leads/new
- Fetches active team members from **************** on mount - Groups members by department with alphabetically sorted departments and members - Formats names a...
Update Platform Administration cards to match unified tab structure
Replace the two stale cards (Organizations standalone page + Configuration) with five cards matching the actual tabs: General, Organizations, VOIP & SMS, System...
Full-width grid layout and move sync trigger from Advanced tab
- Redesign VOIP & SMS tab to use full content-area width: pipeline stats span the top row, Recording Processing and Global Sync Schedule sit side by side in...
Merge Organizations into Configuration page with unified tab nav
- Add Organizations as a tab in **************** (General · Organizations · VOIP & SMS · System User · Advanced order) - Delete **************** standalone page...
Surface PHONE_SERVER_ID on phone-instance overview tab
Operators configuring kamo-asterisk-support on a FreePBX host need to paste the matching VoipProviderInstance UUID into the helper's config file as PHONE_SERVER...
Clickable VOIP extension in Interaction Center opens softphone with number prefilled
Wire call features settings end-to-end through provider abstraction
- voipApi: add CallFeaturesDto type, getCallFeatures() and setCallFeatures() API calls - useSoftphone: add **************** state loaded from API on startup; ...
VOIP_RECORDING_UPLOADS scope + recording pipeline counters/tunables
- APIManager: new VOIP_RECORDING_UPLOADS scope option (used by kamo-asterisk-support on FreePBX hosts to upload voicemail and call recordings via APIService)....
Replace mock contacts tab with fully-featured SoftphoneContacts
Extracts a new SoftphoneContacts component that wires the softphone contacts tab to the real contacts API via useContacts(). Replaces 4 hardcoded mock contacts ...
Replace extension Chip with inline text next to role in Interaction Center
Remove manual phone extension field; write VOIP extension through to SecurityService on save
Cast voiceActivityDetection to bypass missing TS DOM type
voiceActivityDetection is a valid WebRTC MediaTrackConstraints property but is absent from TypeScript's DOM lib, causing a type error at build time.
Wire VAD + push-to-talk; remove unimplementable settings
- vadEnabled now passed as voiceActivityDetection in buildAudioConstraints so the browser honours the toggle when opening mic for a call - pushToTalk auto-mut...
debug+fix(softphone): inspect <audio> element state, auto-recover when bytes arrive but sound stays silent
WebRTC stats from a recent call showed inboundBytes=39680 / receivers unmuted / ICE pair succeeded — the bridge was delivering audio to the browser — yet the op...
Scrollable ringtone list with search filter
Make the ringtone catalog panel match the right-column height and scroll vertically when the list overflows, so members can navigate as more tones are added. Ad...
Dump WebRTC state again 5s after Established + track all state changes
The Established-time dump always shows receivers with muted=true because DTLS handshake and SRTP keying haven't completed yet. To diagnose "call connects but no...
Add seven more ringtones to the catalog
Adds Battleship Horn, Demon Horn, Land Line, 1985 Ring, Office Phone, Ringing Old Phone, and Olé under /public/sounds/ringtones/ and wires them into RINGTONE_CA...
Add Sci-Fi and Buzzer ringtones to the catalog
Drops two new ringtone assets under /public/sounds/ringtones/ and registers them in RINGTONE_CATALOG so they appear in the Ringtones subtab and can be set as th...
Dump WebRTC negotiation state on Established
To diagnose "call connects but no audio between parties", log the peer-connection state (ice / dtls / signaling) along with sender and receiver tracks (kind / e...
Live audio that survives load-interrupts, centered spinner, outbound ringback
Three coordinated fixes for the in-call audio path: 1. AbortError on remoteAudio.play() (visible in production console as "The play() request was interrupte...
Hangup tears down ALL live sessions, not just the primary
Self-call edge case left a session leaked: dialing your own extension creates an outbound session, then Asterisk loops the call back as a second inbound session...
Instant connecting feedback on outbound dial
Same problem the inbound Answer button had: clicking Call kicked off the SIP INVITE round-trip (1-3 seconds) but the button kept its idle "Call" appearance the ...
Connecting animation + audio that actually plays + ringtone unlock
Three coordinated fixes for the inbound-call path: 1. Visual feedback while accepting. Clicking Answer left both buttons responsive-looking but unresponsive...
Mount SoftphoneProvider above ToolDock so tool windows can read it
Opening the Softphone popup crashed the page with "This page couldn't load" because tool windows mount inside ToolDock, which lives in ToolProviders — a SIBLING...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.