KamoCRM

Live Change Log

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

17,411
Total Changes
5,924
Features
5,262
Fixes
30
Projects
Filter by project
All Projects17,411AIService242APIService174BillingService157ConversionService110DaemonService137DocsService223ESigService91EmailService568InitializerService329KBService151KlusterServices738MCPGatewayService235MediaService593RAGService79SecurityService1,835TranslateService62VOIPService249VectorService11kamo-apps26kamo-asterisk-support27kamo-capcha17kamo-capcha-widget4kamo-internal8,333kamo-login335kamo-marketing641kamo-nowww20kamo-register213kamo-shared-library1,641kamo-signer-monorepo56kamolos114
Filter by type
All TypesBuild16CI523Chore773Docs3,252Feature5,924Fix5,262Other993Performance165Refactor278Revert23Style42Test159Upgrade1
April 26, 2026
FixSecurityService

Resolve display name with correct priority in by-department endpoint

Priority: member.usernameAlias → user.name.formatFull() → user.alias → user.username

Kamo·6mo ago
Featurekamo-shared-library

Add isDisplayOnIntake to create/update request DTOs

Kamo·6mo ago
Featurekamo-shared-library

Expose isDisplayOnIntake in FormFieldDTO

Kamo·6mo ago
Featurekamo-shared-library

Add IS_DISPLAY_ON_INTAKE column to FormField entity

Kamo·6mo ago
Fixkamo-internal

Probe master model endpoint and fix appliedModel org ID

- Replace appliedModel.source-based gate with a direct probe of /api/security/master-model on mount; r.ok=false (409) means the org is governed by a branch ...

kamo·6mo ago
Chorekamo-marketing

Update locale translations and hash [skip ci]

Kamo CI·6mo ago
Fixkamo-internal

Gate censorship tab options by applied model constraints

- Hide EDIT MASTER MODEL button when org is governed by a branch type (use appliedModel.source instead of unreliable org context branchTypeID) - Hide ATF fiel...

kamo·6mo ago
Featurekamo-internal

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...

kamo·6mo ago
Featurekamo-marketing

Add Flowroute to integrations hub page

Kamo·6mo ago
Featurekamo-marketing

Add Flowroute to INTEGRATED WITH banner

Kamo·6mo ago
Fixkamo-internal

Mark-as-read and message fetch for shared/member mailboxes

Classic mode now loads shared mailbox messages via the correct /messages/{folder} endpoint (was calling the non-existent /conversations endpoint). Fetching a fu...

kamo·6mo ago
FixEmailService

Mark-as-read for shared and member mailboxes

EmailController.setFlags now accepts an optional mailboxId query param and routes through resolveProviderWithMailbox so member-mailbox flags are set against the...

Kamo·6mo ago
Featurekamo-internal

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...

kamo·6mo ago
FeatureVOIPService

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...

Kamo·6mo ago
Featurekamo-shared-library

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.

Kamo·6mo ago
FixVOIPService

Use extensionId as external ID, not Relay node id

FreePBX returns the same Relay id (ZXh0ZW5zaW9uOg== = "extension:") for every extension because the id field is not populated. Using it caused all extensions to...

Kamo·6mo ago
FixEmailService

Handle IMAPInputStream in getMessage to prevent ClassCastException

JavaMail can return an IMAPInputStream instead of a decoded String from part.getContent() when message content has not been pre-fetched. The direct (String) cas...

Kamo·6mo ago
Featurekamo-marketing

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...

Kamo·6mo ago
Featurekamo-internal

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...

kamo·6mo ago
FeatureInitializerService

Backfill is_available = TRUE for existing members

Kamo·6mo ago
Featurekamo-shared-library

Add isAvailable field for member availability toggle

Kamo·6mo ago
FixVOIPService

Rewrite all GQL queries/mutations against live schema introspection

Verified every field name and type against the actual FreePBX 17 schema. Full set of corrections: Queries: - fetchAllExtensions: remove non-existent 'voicemail...

Kamo·6mo ago
Fixkamo-internal

Pass selectedFolder to ThreadDetailView so email:folder-changed fires with a valid folder

conversation.folder is always undefined because the Java ConversationEntity has folderIds (text[]) not a folder string field. This caused loadThread to call mar...

kamo·6mo ago
FixVOIPService

Correct GraphQL field name to fetchAsteriskDetails

FreePBX API returns "Did you mean fetchAsteriskDetails?" — rename the health check query and its data path accessor accordingly.

Kamo·6mo ago
FixVOIPService

Add XHR/Accept headers and String response parsing to GraphQL client

Same pattern as FreePBXTokenCache: add X-Requested-With + Accept: application/json to suppress FreePBX's HTML redirect responses, and switch all three call site...

Kamo·6mo ago
Fixkamo-internal

Sync mailbox dropdown to primary mailbox on load

Dropdown defaulted to first list item because selectedMailbox initialized without a mailboxId, causing currentValue to resolve to bare 'personal' which matched ...

kamo·6mo ago
FixAPIService

Raise file upload size limit to 500MB

Spring Boot defaults cap multipart parts at 1MB, causing background image uploads to fail with 500 in request.getParts(). Match SecurityService's existing 500MB...

Kamo·6mo ago
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

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