KamoCRM

Live Change Log

Every feature, fix and improvement, posted as it ships. Nothing is held back for a launch.

17,381
Total Changes
5,898
Features
5,258
Fixes
30
Projects
Filter by project
All Projects17,381AIService242APIService174BillingService157ConversionService110DaemonService137DocsService223ESigService91EmailService568InitializerService329KBService151KlusterServices738MCPGatewayService235MediaService592RAGService79SecurityService1,824TranslateService62VOIPService248VectorService11kamo-apps26kamo-asterisk-support27kamo-capcha17kamo-capcha-widget4kamo-internal8,322kamo-login335kamo-marketing641kamo-nowww20kamo-register213kamo-shared-library1,635kamo-signer-monorepo56kamolos114
Filter by type
All TypesBuild16CI523Chore773Docs3,252Feature5,898Fix5,258Other993Performance165Refactor278Revert23Style42Test159Upgrade1
April 26, 2026
Fixkamo-internal

Surface HTTP errors so upload failures are visible

Replaced silent console.warn with a thrown Error on non-OK status, so the user sees the actual failure reason (status + response body) instead of silently proce...

kamo·6mo ago
FixVOIPService

Add Accept+XHR headers and raw-string response parsing for token endpoint

FreePBX was returning text/html when called via cluster DNS because the Host header didn't match the configured PBX_HOSTNAME. Adding Accept: application/json an...

Kamo·6mo ago
Fixkamo-marketing

Drive minimized-tab entry through animation controls

Switching animate={...} to animate={tabControls} broke the entry animation: tabControls has no queued target on mount, so the button stayed at its initial { y: ...

Kamo·6mo ago
FixVOIPService

Correct OAuth2 scope strings for FreePBX API

FreePBX scopes are top-level identifiers: 'gql' (all GraphQL) and 'rest' (all REST). The format 'gql:read' means GQL for a module named 'read', which doesn't ex...

Kamo·6mo ago
FixKlusterServices

Expose port 8088 directly on ClusterIP service

Service only had port 80→8088 mapping. Internal services using **************** (e.g. VOIPService API token requests) were timing out because port 8088 had no l...

Kamo·6mo ago
Fixkamo-internal

Trust backend pendingCount, drop client offsets

Backend pendingCount is now unread-based (counts SUPPORT_TICKET sessions with messages newer than the owner's lastViewed). When the agent opens a ticket, markAs...

kamo·6mo ago
FixKlusterServices

Add missing fail2ban-config ConfigMap for k1m1

Deployment references fail2ban-config ConfigMap (jail.local + asterisk-security.conf) but it did not exist, blocking the pod at MountVolume.SetUp and preventing...

Kamo·6mo ago
April 25, 2026
Fixkamo-internal

MarkAsRead after agent send so lastViewed advances

On support tickets, both visitor and agent messages are stored under the same systemMember, so the unread-count query is member-agnostic and relies entirely on ...

kamo·6mo ago
Fixkamo-shared-library

Support tickets need member-agnostic unread counts

Visitor messages on support tickets are stored under the same systemMember that the agent authenticates as, so the existing CHAT-session unread queries — which ...

Kamo·6mo ago
Fixkamo-internal

Pass folder to loadThread retry button

loadThread takes (threadId, folder); the error-state retry button only passed threadId, breaking the kamo-internal build. Match the call to the signature.

kamo·6mo ago
Fixkamo-shared-library

Correct JsonIdentityInfo property from 'uniqueId' to 'id'

Member entity declared @JsonIdentityInfo(property = "uniqueId") but the actual primary key field is named 'id'. Jackson threw "cannot find property with name 'u...

Kamo·6mo ago
Fixkamo-marketing

Remove SSR guard causing hydration mismatch; drop SockJS for native WebSocket

- Hero.tsx: remove typeof window check around ParticleField — ParticleField already has ssr:false so the guard produced a server/client tree mismatch (React #...

Kamo·6mo ago
Fixkamo-internal

Clear unread indicators when conversation is opened

ThreadDetailView now dispatches email:folder-changed after markConversationRead succeeds so MailButton refetches the navtop inbox badge count. ConversationListV...

kamo·6mo ago
FixAPIService

Move CORS to Traefik via kamo-middlewares, remove in-app CorsFilter

The CorsFilter @Bean in the Spring app was silently not applying headers after WebConfig.java was removed. CORS is now handled entirely at the Traefik layer by ...

Kamo·6mo ago
Fixkamo-marketing

Use /public/{mainDomain}-{tld} path matching actual MinIO bucket layout

The getThemePath() was generating /domain/{tld}/{split}/kamosite paths that don't exist in MinIO — theme files live in the public bucket under kamocrm-com/, bad...

Kamo·6mo ago
Fixkamo-internal

Break min-w-0 chain to contain email scroll in body column only

Add min-w-0 to outer container and main content flex div so flex children cannot expand to email min-content width, which was causing the page-wide horizontal s...

kamo·6mo ago
Fixkamo-internal

Hoist providers above ToolProviders

Same root cause as the ChatWebSocketProvider hoist: SupportTicketWindow calls **************** and ChatBox calls useUnread().markAsRead(), but both tool windows...

kamo·6mo ago
Fixkamo-marketing

Add suppressHydrationWarning and fix broken placeholder images

suppressHydrationWarning on <html> prevents React error #418 caused by browser extensions (e.g. translate, dark mode) mutating html attributes between SSR and c...

Kamo·6mo ago
FixKlusterServices

Allow /domain/ path prefix on theme IngressRoute for CORS

The theme config at theme.kamocrm.com/domain/... was not matched by the existing route rules (only /public/ and /internal/ were allowed), so Traefik returned a ...

Kamo·6mo ago
FixAPIService

Remove duplicate CorsFilter and strip upstream CORS headers in gateway

WebConfig.java defined a second CorsFilter bean competing with CorsConfig.java's bean, risking duplicate header writes. Deleted it so only one CorsFilter exists...

Kamo·6mo ago
FixSecurityService

Remove duplicate CorsFilter bean causing double Access-Control-Allow-Origin header

The explicit CorsFilter bean caused a second CORS filter alongside Spring Security's built-in CORS support (which uses CorsConfigurationSource). Both filters re...

Kamo·6mo ago
Fixkamo-internal

Remove debug console.log statements and add missing routes

Remove all temporary debug logging added during WebSocket tracing from ChatBox, TicketChat, MemberItem, ChatTool, and useChatWebSocket; add redirect pages for /...

kamo·6mo ago
Fixkamo-internal

Prevent message header from expanding column on long addresses

The header's left flex child had no min-w-0, so long unbreakable email addresses in From/To/Cc forced its min-content width to grow, dragging the header (and th...

kamo·6mo ago
Fixkamo-internal

Hoist ChatWebSocketProvider above ToolProviders

ToolDock (and its tool windows like SupportTicketWindow → TicketChat) is mounted inside ToolProviders, which sits ABOVE PresenceWrapper in the tree to avoid unm...

kamo·6mo ago
Fixkamo-internal

Drop Shadow DOM in email renderer so overflow-x-auto fires

Shadow DOM was the root cause. Wide email content (fixed-width tables) inside the shadow tree painted past the host without contributing to the host's layout bo...

kamo·6mo ago
Fixkamo-internal

Align ChatWebSocketContext import path to match provider

TicketChat and ChatNotificationListener imported the context via the '@/app/contexts/...' alias while PresenceWrapper (the provider) imports it via the relative...

kamo·6mo ago
Fixkamo-internal

Force shadow host containment with inline styles + contain: layout

Class-based overflow-x-auto on the shadow host wasn't reliably winning against the shadow ':host { all: initial }' reset, so wide email content (fixed-width tab...

kamo·6mo ago
Fixkamo-internal

Scroll wide email content inside shadow DOM, not outside

The previous attempts at adding overflow-x-auto to light DOM ancestors could not catch wide email content because the shadow tree's visual paint overflow does n...

kamo·6mo ago
FixEmailService

Use getHasAttachments() to match Boolean wrapper type

**************** is a Boolean (wrapper), so Lombok generates getHasAttachments() not isHasAttachments(). The latter only exists for primitive boolean. Use Boole...

Kamo·6mo ago
FixMediaService

Expand JPA repository scan to include commerce package

The new kamo-shared-library brings in **************** which requires **************** (in com.kamo.z.shared.commerce). MediaService only scanned donotmodify.da...

Kamo·6mo ago
FixMediaService

Restore HashMap import in ChatWebSocketController

The previous refactor removed the HashMap import but the handleTyping method still constructs a HashMap for the typing event payload, causing the Forgejo build ...

Kamo·6mo ago
Fixkamo-internal

Add min-w-0 to email content div so overflow-x-auto fires

Without min-w-0, the flex-col child's default min-width:auto resolves to min-content, letting wide email tables expand the div past the column width. The outer ...

kamo·6mo ago
Fixkamo-marketing

Remove duplicate connectStomp call in sendMessage

When the first message creates a new session, onSessionCreated updates props which triggers useEffect to call connectStomp. The inline call in sendMessage was r...

Kamo·6mo ago
FixMediaService

Proactively create NATS consumer at session creation to prevent message loss

Previously the NATS JetStream push consumer was only created when a STOMP client sent /app/chat/subscribe. With DeliverPolicy.New, any messages published before...

Kamo·6mo ago
Fixkamo-internal

Close reconnect gap causing dropped real-time messages

Remove `connected` from subscription useEffect deps in TicketChat and ChatBox. Previously, every WebSocket reconnect triggered the effect cleanup which called u...

kamo·6mo ago
FixSecurityService

Allow system user to manage org branding and fix logo auth

- Add system user bypass as first guard in canManageOrgBranding so platform system user has full branding control over all non-parent orgs - Fix uploadLogo en...

Kamo·6mo ago
Fixkamo-internal

Contain horizontal overflow in email view pane to 3rd column

- Add overflow-x-hidden to MessageBrowser outer container as hard boundary - Add overflow-x-hidden to column 3 wrapper and overflow-x-auto to email content area...

kamo·6mo ago
FixKlusterServices

Replace Coqui TTS with Piper TTS (en_US-norman-medium)

Coqui VCTK model has no named speakers — replace with Piper TTS which has the exact norman[medium] voice. Piper binary (~3 MB) and model (~60 MB) are downloaded...

Kamo·6mo ago
FixEmailService

Reset stale hasAttachments on sync and accumulate correctly

- Reset has_attachments=false at start of bulk sync so stale true values from old false-positive MIME detection are cleared before re-indexing - Accumulate ha...

Kamo·6mo ago
Fixkamo-internal

Pre-populate FROM on reply/forward and fix send fromAddress

- DraftMessage now carries fromAddress so it flows from openNewMessage through to the composer - MessageBrowser stores the active mailbox emailAddress (includ...

kamo·6mo ago
FixEmailService

Support fromAddress override on send

Adds FromAddressRequest to EmailSendRequest so the frontend can specify which alias/shared/mailbox address to send from. SmtpOnlyProvider now uses that address ...

Kamo·6mo ago
FixKlusterServices

Add local_net for split-DNS / LAN client RTP fix

Phones on the same LAN as k1m1 connect via split DNS (domain resolves to 192.168.4.22 internally). Without local_net, Asterisk still advertises the external dom...

Kamo·6mo ago
FixKlusterServices

Persist sorcery contact=memory fix and block SIP scanner in startup.sh

- Inject [res_pjsip] contact=memory into sorcery.conf before Asterisk starts; the default sorcery-astdb SQLite backend silently drops all REGISTER contacts - ...

Kamo·6mo ago
Fixkamo-internal

Sub-tab content fills full content-area width

Drop the centered max-width constraint (was 920 / 1200 / 680 / 720 depending on tab) on SubTabShell. The page already lives inside SettingsView's content column...

kamo·6mo ago
FixEmailService

Fix attachment parsing and hasAttachment false positives

Three fixes to EmailImapService: 1. toEnvelope: narrow multipart check to multipart/mixed only — plain HTML+text emails (multipart/alternative) no longer sh...

Kamo·6mo ago
Fixkamo-internal

Add download button to classic view attachment section

The classic view (MessageBrowser) had its own attachment list that was missing the download button — only the conversation view was fixed previously. Also align...

kamo·6mo ago
April 24, 2026
FixEmailService

Add com.kamo.z.shared.commerce to EnableJpaRepositories scan

**************** (required by **************** in the shared library) lives under com.kamo.z.shared.commerce but was not included in the JPA repository scan, ca...

Kamo·6mo ago
Fixkamo-internal

Proper layout, padding, and provider logos

Layout / spacing fixes: - All six tabs (Providers, Extensions, Phone Users, Devices, Voicemail, Health) now wrap their content in a TabShell with px:{xs:2,md:...

kamo·6mo ago
FixEmailService

Correct field name and type in getFromAddresses response

Backend was sending 'email' key but frontend expected 'address', and sent type 'shared_mailbox' when frontend expected 'shared'. Also fixes hasMailboxes flag wh...

Kamo·6mo ago
Fixkamo-internal

Load FROM addresses from accessible mailboxes and aliases

Replaces the broken getFromAddresses() endpoint (which sent 'email' instead of 'address') with getAccessibleMailboxes() + listMemberAliases(), matching the same...

kamo·6mo ago

Like what you see shipping?

All of it arrives in your workspace on its own. Start on the free plan and read this page again in a month.

Start Free ForeverView Pricing