Pipe sip.js init steps to server log via beacon
The browser-side SDK init failure is currently invisible — the popup just says "Phone SDK failed to initialize" with no message, the WebSocket never opens, and ...
Periodic STOMP presence heartbeat for public support
Refresh Redis TTL for public session presence so agents see accurate online state.
Globe uses media session presence for marketing visitors
Request public-chat session GUIDs in presence snapshot; treat online if either session or requestor member is connected. Handle snapshot envelope and sessionGui...
Track public support chat by session GUID in Redis
Marketing visitors use /ws/public-chat-native without memberId; tickets still reference the org placeholder member as requestor. Increment PRESENCE_PUBLIC keys ...
Surface SIP.js init/transport errors to browser console
Empty "Phone SDK failed to initialize" messages were hiding the actual failure from sip.js. Turn on logBuiltinEnabled so the library writes its transport / regi...
Don't wipe member assignment on sync from providers that lack metadata
**************** unconditionally overwrote PhoneExtension.assignedMemberId with whatever the provider returned. FreePBX (and any provider that doesn't track whi...
Add includeCompany to market popup and companyName to leads
Market add/edit popup (LeadMarketManager): - Radio control "Track Company Name" / "Individual Only" (required) - Defaults to unset on new market; pre-fills on e...
Add include_company and company_name columns
LeadCompanyColumnRunner (Order 40) idempotently adds: - lead_markets.include_company (BOOLEAN, nullable) — tracks whether a market requires company name on le...
Expose includeCompany in intake-config and market-config responses
Both **************** and **************** now include the includeCompany flag so the frontend knows whether to show the company name field on lead creation.
Add includeCompany to LeadMarket and companyName to Lead
- LeadMarket entity gets include_company (Boolean, nullable) - Lead entity gets company_name (String, max 50, nullable) - LeadMarketDTO, CreateLeadMarketRequest...
Show provider name in view mode + own extension in edit dropdown
Two bugs on **************** 1. View mode dumped the raw UUID — "Instance 32f520b0-347a-…" — because the instance list was only loaded inside handleVoipEdit...
Serialize ExtensionDto.assignedMemberId as a string
overflows JS's safe-integer range (e.g. 1168485658174423046 round-trips as 1168485658174423000 once a JSON number hits the browser). The frontend already typed ...
Add diagnostic logging to /names endpoint
Log orgId, member count, and per-member name resolution to diagnose why the assigned-member name is not resolving correctly.
Make WebRTC config survive pod restart
The previous approach (http_custom.conf with [general] override) didn't actually take effect because Asterisk's INI parser doesn't honor multiple [general] sect...
Enable Asterisk built-in HTTP server on :8089 for WebRTC /ws
A chan_pjsip `protocol=ws` transport rides on top of res_http_websocket, which in turn requires Asterisk's built-in HTTP server to be running. The default FreeP...
Show sales type path in Add Lead subtitle
Append the market's Sales Type and Sub-Type to the "Adding to" line so the form mirrors the labels used in the Edit Market popup at **************** Renders as ...
Prioritize real first/last name over usernameAlias for display
usernameAlias is functionally a login handle (often equal to username), not a display name. Real human-readable names live on User.name (EmbNameFull). Apply to ...
Move Create Lead action into header, drop sticky bar
Replace the top-right Cancel button with the primary Create Lead action and remove the bottom sticky action bar entirely. Add a back IconButton to the left of t...
Scope Add Lead scroll and footer to its content area
The form was using minHeight: 100vh inside a parent that's already calc(100vh - 56px), forcing an outer scrollbar even when content fit. The action bar also use...
Unified PhoneSdk supporting RingCentral + sip.js (FreePBX)
The softphone hook used to instantiate ringcentral-web-phone unconditionally, which threw on any FreePBX credential shape because that SDK is hard-coded to Ring...
WSS-aware SIP credentials for browser softphones
The /api/voip/sip/credentials endpoint now returns credentials a browser-side SIP stack can actually use: WSS transport, public domain, and a wsServers URL. - ...
Add WSS WebRTC transport for browser softphones
Asterisk's chan_pjsip now binds a plain WebSocket transport on 0.0.0.0:8089 and Traefik terminates TLS at **************** (port 443) so kamo-internal can regis...
Smart multi-column layout for Add Lead form
Restructure the page into a top-level grid so sections compose horizontally instead of stretching individual fields: - Market & Assignment uses a 3-col interio...
Use /api/security/members/names for assigned-member name resolution
The by-department endpoint filters to active TeamMembers only, missing assignments to base Members or inactive members. Switch to /names which returns all membe...
Add /names endpoint returning id→name for all members regardless of state
The by-department endpoint filters to active TeamMembers only, but extension assignments may reference base Members or inactive members. Use /names for ID→name ...
Make Best Contact Time a free-text field
Replace the Morning/Afternoon/Evening dropdown on the Add Lead and Lead View edit forms with a plain text input so members can describe specific windows (e.g., ...
Full-width Add Lead form and clearance for sticky footer
Drop the 1200px max-width on /leads/new so the form spans the page area, and bump bottom padding so the sticky action bar no longer overlaps the last form secti...
Single-lead Add Lead form at /leads/new
Refactor Add Lead from an in-page multi-tab pane into a dedicated route at /leads/new so it can be linked directly. The current market is passed through as ?mar...
Add **************** endpoint
Returns salesType, subType, and customForms for a market by marketId so the Add Lead form can render sub-type fields and intake custom forms without first creat...
Resolve display name with correct priority in by-department endpoint
Priority: member.usernameAlias → user.name.formatFull() → user.alias → user.username
Add missing isDisplayOnIntake field to FormField interface and new field literal
Serialize Long as string to prevent JS precision loss on large CockroachDB IDs
Coerce isDisplayOnIntake=true when isRequired=true in CustomFormService
Add member name display and unassign button to per-instance extensions tab
Show member names and add Unassign action to org-level extensions tab
Wire VOIP configuration to provider+extension selectors with assignment enforcement
Add typed DTOs, unassign API method, and update MembershipPermissionsTab VOIP types
Add DELETE assignment endpoint to VoipExtensionsController for admin unassign
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.