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
Add MemberVoipConfigController for member VOIP config with extension assignment
Add findByAssignedMemberId query methods to PhoneExtensionRepository
Persist active mailbox in URL query params
Switching mailboxes now updates the URL (?mailboxType, ?mailboxId, ?mailbox) so refreshing the browser restores the same mailbox. MessageBrowser reads window.lo...
Show accurate provider connection status from isConnected field
Replaces the old logic that showed "Connected" for any provider with no sync error (including brand-new providers that were never tested). New three-state badg...
Persist connection test result to isConnected field
- test() endpoint saves isConnected=true/false to DB after every health check - update() resets isConnected to null when configJson changes (credentials may h...
Add isConnected field to VoipProviderInstance
Nullable Boolean: null = never tested, true = last test passed, false = failed. Requires KamoInitializerService schema migration to add IS_CONNECTED column.
Show active offer banner with live millisecond countdown
Fetches the active promotion server-side on the home page and renders a HeroOfferBanner between the subheadline and the free-forever callout. The banner shows t...
Wire Available/Unavailable switch to backend and fix OFFLINE presence bug
- Rename Paused/Active chip to Available/Unavailable in NavTop - Fetch initial availability on mount and persist toggles via new me/availability API - Add isAva...
Add isAvailable to by-department response and me/availability endpoints
Live unread badge + bounce on new agent message
- Keeps LiveSupportPanel mounted offscreen while the widget is minimized (only when a support session exists) so the STOMP subscription stays alive and onUn...
Broadcast pending count + unread on agent read & visitor send
- **************** now delegates to **************** so the count reflects sessions with unread visitor messages and decrements when the agent calls markA...
Unread-based count + lookup-by-session helper
Adds **************** so the navtop SupportButton badge can count support tickets that actually need attention (have unread visitor messages) instead of just PR...
Add Location column to ticket datagrid
Reads **************** straight off the SupportTicketDTO (now snapshot on the ticket entity at creation time — no extra round trip). Renders flag + city/region/...
Snapshot visitor geo on ticket entity
Adds VISITOR_IP_ADDRESS, VISITOR_COUNTRY_CODE, VISITOR_COUNTRY_NAME, VISITOR_CITY, VISITOR_SUBDIVISION columns. Captured at ticket creation so the list/detail e...
Add /ws/public-chat-native plain WebSocket endpoint alongside SockJS
Registers a second STOMP endpoint without SockJS at /ws/public-chat-native so that the frontend can connect with a native WebSocket (brokerURL) without needing ...
Per-ticket unread badge + 'New messages only' filter
- Ticket list shows a chat-bubble badge with the unread count next to ticket# whenever the session has messages newer than the agent's last viewed message. ...
Broadcast unread counts to agent on visitor message
After a visitor sends a support message, push the latest unread-counts payload to **************** so the agent's ticket-list badge and navtop counter update in...
Include SUPPORT_TICKET sessions in unread membership query
findChatMembershipsByMemberId now returns memberships for both CHAT and SUPPORT_TICKET session types, so the existing per-member unread-count infrastructure (ge...
Production fail2ban with PJSIP jails and persistent state
- Add fail2ban-configmap.yaml with [asterisk] and [freepbx-web] jails, incremental ban escalation (1h→24h→30d ceiling), LAN ignoreip, and a custom asterisk-...
Add resetHasAttachmentsForFolder query to ConversationRepository
Allows sync to reset stale has_attachments flags before re-indexing so corrected MIME detection can rebuild the field from actual attachment data.
Integrate Coqui TTS with norman voice (VCTK p267)
- Deploy coqui-tts server (VCTK VITS model, CPU-only) as ClusterIP service on port 5002 with model cache at /var/lib/coqui-tts on k1m1 - Inject coqui_tts.agi ...
Add LAN DNS pod for split-DNS on k1m1
Deploys a dnsmasq pod with hostNetwork on k1m1 that listens on 192.168.4.22:53. Overrides pbx.k1.kluster.kamocrm.com -> 192.168.4.22 so LAN phones reach the PBX...
Platform configuration tabs (General / VOIP & SMS / System User / Advanced)
Wraps **************** in SettingsView with four tabs: - General: read-only platform overview — total orgs, active phone-server instance count, active SMS-pr...
Global VOIP sync job (admin-tunable interval)
VoipGlobalSyncJob ticks every minute and, on each tick, reads the SystemConfiguration singleton to decide whether a global sync is due: - If voipSyncEnabled is ...
System-config + platform-overview endpoints
Platform-wide configuration surface, gated by the existing top-level-owner guard (matches SystemUserConfigController's requireTopLevelOwner pattern). Endpoints...
Per-instance resource controllers + org aggregate + internal sync
Per-instance resource CRUD (extensions / users / devices / voicemail): - VoipExtensionsController at **************** - VoipUsersController at /api/voip/instanc...
Multi-instance provider refactor + full FreePBX + Flowroute SMS
Core model change: one org → many VoipProviderInstances (was: one per org). Every provider API call is now instance-scoped. PhoneProvider interface: - New meth...
Multi-instance phone/SMS provider migration
Runs after Hibernate ddl-auto:update creates new tables (VOIP_PROVIDER_INSTANCE, BULK_TEXT_PROVIDER_INSTANCE, PHONE_EXTENSION, PHONE_END_USER, PHONE_DEVICE, PHO...
Multi-instance phone/SMS provider schema foundation
- Rename VoipProviderConfig → VoipProviderInstance; drop UNIQUE(org_id), add instance_name, config_json, last_sync_at, last_sync_error. - Rename BulkTextProvide...
Deploy FreePBX 17 + Jigasi SIP bridge on k1m1 and k2m1
FreePBX (tiredofit/freepbx:17-latest) runs with hostNetwork so SIP/RTP preserves real client IPs, pinned one-per-node via nodeSelector. SIP on 5060 UDP/TCP (506...
Platform-admin view, pagination, live search, filters, org logos
Platform admins (top-level org owner) now see every org in the system via the new /api/security/org/all-networks endpoint instead of just their own memberships....
Add GET /api/security/org/all-networks for platform admins
Top-level org owners can now fetch all organizations in the system with membership info relative to the caller. Orgs where the caller has a member record get is...
Sub-tabs in security-model editor + cleanup
- Security-model editor on **************** is now split into four sub-tabs: General (Basic Info, Visibility, Who Can Create, Platform Settings, Domain Conf...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.