KamoCRM

Live Change Log

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

17,374
Total Changes
5,891
Features
5,258
Fixes
30
Projects
Filter by project
All Projects17,374AIService242APIService174BillingService157ConversionService110DaemonService137DocsService223ESigService91EmailService568InitializerService329KBService151KlusterServices738MCPGatewayService235MediaService592RAGService79SecurityService1,822TranslateService62VOIPService248VectorService11kamo-apps26kamo-asterisk-support27kamo-capcha17kamo-capcha-widget4kamo-internal8,321kamo-login335kamo-marketing641kamo-nowww20kamo-register213kamo-shared-library1,631kamo-signer-monorepo56kamolos114
Filter by type
All TypesBuild16CI523Chore773Docs3,252Feature5,891Fix5,258Other993Performance165Refactor278Revert23Style42Test159Upgrade1
October 23, 2026
FixBillingService

Invoice checkout sessions are unkeyed, like every checkout Session

A stable idempotency key would hand a returning customer the same, possibly expired, payment page ****************

KamoΒ·19h ago
FixBillingService

Cap only add-ons the organization holds

An add-on it does not hold is left to the existing entitlement gates, as before caps existed - paying organizations running a phone server without the add-on co...

KamoΒ·20h ago
October 22, 2026
FixBillingService

Stripe bills add-on licenses held, not mailboxes or extensions in use

Every add-on now takes its quantity from AddOnLicenses, the rule the order calculator and subscription invoices share: licenses bought, defaulting to the seat c...

KamoΒ·23h ago
FixBillingService

Read Stripe events from any API version, and replay the ones that failed

The live webhook endpoint renders events at 2026-03-25.dahlia; stripe-java pins 2024-12-18.acacia, so every invoice, payment and subscription event since has fa...

KamoΒ·1d ago
October 19, 2026
FixBillingService

GodModeVerifier judges the god-mode window at its own clock (shared SessionPlatformFacts expiry)

**************** now also needs godModeExpiresAt ahead (kamo-shared-library 1.6.1). windowOpen(session, memberId, now) asked the shared reader at the system clo...

KamoΒ·4d ago
October 18, 2026
FixBillingService

Billing accounts answer to VIEW_ORG_BILLING / MANAGE_ORG_BILLING, and the listing shows a member only their own (SITP TP02)

BillingService authorized 'own account or organization owner' and never consulted a right, so the owner could not hand billing to an administrator or an SI. Acc...

KamoΒ·5d ago
FixBillingService

Stop logging the database password at startup

com.zaxxer.hikari at DEBUG makes HikariConfig print its whole configuration on every start, including dataSourceProperties {password=...} and password......; Pr...

KamoΒ·5d ago
October 14, 2026
FixBillingService

Seat the organization's existing staff when it starts paying

Turning PAID seated only the buyer; everyone else hit "This needs a licensed seat" on the product just bought until the owner assigned seats by hand. On the tra...

KamoΒ·1w ago
FixBillingService

God mode comes from the caller's own session window, never a header

BillingService took X-God-Mode-Active plus users.is_god as god mode, and kamo-internal copied that header straight off the browser, so a god-eligible operator h...

KamoΒ·1w ago
September 28, 2026
FixBillingService

The Enterprise refusal names KamoUniverse

"The Enterprise plan is arranged directly with KamoCRM and cannot be selected here. Contact us and we will set it up for you." is echoed verbatim to the custome...

KamoΒ·3w ago
September 23, 2026
FixBillingService

Pin kamo-shared-library 1.6.1, the only version that exists

The library moved to 1.6.1 and this service still asked for 1.6.0. There is no window in which both resolve: the library is never published to a remote, so the ...

KamoΒ·4w ago
FixBillingService

Only an organization's owner may change who pays for mailboxes or extensions

**************** and **************** had no authorization check at all β€” any member of the organization, not only its owner, could move the whole organization'...

KamoΒ·4w ago
September 10, 2026
FixBillingService

Rerun a webhook event whose first attempt died, and refuse one the SDK cannot read

A losing claim on an unprocessed row always answered 500, so an event whose first attempt failed (a unique-constraint race inside the invoice.created/finalized/...

KamoΒ·1mo ago
FixBillingService

Only a failed charge starts dunning, and Stripe must agree before dunning acts

invoice.finalized carries status=open with an amount due for every auto-charged invoice before the charge is attempted, and the invoice handler started the deli...

KamoΒ·1mo ago
September 9, 2026
FixBillingService

The same-commit-rebuild guard could never fire, and the digest check failed open

Both protections against a deploy that deploys nothing were inert, so the pipeline reported two green jobs while the pods stayed on the previous digest. That is...

KamoΒ·1mo ago
FixBillingService

A catalog row naming an app this build cannot resolve is not for sale

ServiceTypeConverter stopped throwing on an unknown app id and started resolving it to null, which is what a service must do β€” the enum ships inside each jar wh...

KamoΒ·1mo ago
September 7, 2026
FixBillingService

A price Stripe has never heard of is a fault, not a silence

The reconciler compared mapped prices against the catalogue and returned early whenever nothing was mapped at all. So a term the catalogue had gained since the ...

KamoΒ·1mo ago
September 6, 2026
FixBillingService

Charge what the screen says, and refuse rather than pretend

An audit of the Plans & Billing console against live Stripe keys found the seam between the screen and Stripe broken in every direction at once, and silent in a...

KamoΒ·1mo ago
September 5, 2026
FixBillingService

Prove the deploy by digest, not by tag

The preceding commit stops `set image` being a silent no-op. This asserts the outcome: after the rollout, the tag is resolved to a digest at the registry and th...

KamoΒ·1mo ago
FixBillingService

A rebuild of the same commit deployed nothing and reported success

The image is tagged with the commit SHA, so rebuilding the same commit produces an identical image reference. `kubectl set image` then changes nothing, the Depl...

KamoΒ·1mo ago
September 4, 2026
FixBillingService

Let a rollout finish what the old pod was doing

Deploys replaced the only pod of each service with nothing to catch the requests in flight. Three settings, applied across the fleet: - preStop sleeps 10s befo...

KamoΒ·1mo ago
August 31, 2026
FixBillingService

Stop offering the internal platform-owner plan for sale

listPlansForMarket filtered on isActive alone, and active is not the same as on the menu. OWNER_UNLIMITED ("Platform Owner β€” Internal") is active, carries no pr...

KamoΒ·1mo ago
August 27, 2026
FixBillingService

The platform org is not gated by its own catalog

The platform org was told "Requires the KamoPBX Hosting add-on" on its own phone-server screen, for an add-on it publishes. It owns the plan catalog, the add-o...

KamoΒ·1mo ago
August 26, 2026
FixBillingService

Scan the shared-lib email.billing repository package

@EnableJpaRepositories lists packages explicitly, so MailboxBillingDayRepository was invisible and the service refused to start outright β€” caught by booting it,...

KamoΒ·1mo ago
FixBillingService

Close the webhook idempotency gap BL0's final review found

Finding 1 (Critical): a losing claim on a redelivered Stripe event only proved a row existed, not that the prior attempt finished. A claimed row left behind by ...

KamoΒ·1mo ago
FixBillingService

Do not key ephemeral per-attempt Stripe creates

Round 2 review (Ruling 17) found "is this a create?" is necessary but not sufficient. The question that matters: can this subject legitimately be created more t...

KamoΒ·1mo ago
FixBillingService

Keys belong on Stripe creates only, not on mutations

Round 1 review (Ruling 15) found the Critical: a stable idempotency key on an update/cancel/attach/detach is not a safeguard, it is a bug. Those calls already s...

KamoΒ·1mo ago
FixBillingService

Make every Stripe write idempotent, and fail the build on a new one without a key

A socket timeout on a Stripe write that actually succeeded is indistinguishable, from our side, from one that did not; without an idempotency key the retry crea...

KamoΒ·1mo ago
FixBillingService

Commit the processed flag with the money write, not ahead of it

markProcessed was REQUIRES_NEW, so it committed processed=true while the handler's money writes were still uncommitted in the suspended outer transaction. JpaTr...

KamoΒ·1mo ago
August 25, 2026
August 23, 2026
FixBillingService

Stop selling add-ons the chosen plan already includes

The catalog has always recorded which add-ons a plan bundles, in **************** β€” Business and Enterprise carry video conferencing, the AI assistant, the HR s...

KamoΒ·2mo ago
August 16, 2026
FixBillingService

Size the pod above its own JVM heap ceiling [skip ci]

The image starts the JVM with -XX:MaxRAMPercentage=70 -XX:+AlwaysPreTouch, so the heap alone may take 70% of the container limit and pre-touch keeps every commi...

KamoΒ·2mo ago
August 12, 2026
FixBillingService

Cancelling stops future billing and nothing else

Cancel no longer takes an "immediate" flag, and no customer-facing route can ask for one. Passing it true ended the subscription the same day while asking Strip...

KamoΒ·2mo ago
August 11, 2026
FixBillingService

Stop shipping a shared credential as a config default

The platform's shared password was baked in as the fallback for DB_PASSWORD and MINIO_ROOT_PASSWORD, so it lived in this repo and in the built image as well as ...

KamoΒ·2mo ago
FixBillingService

Stop revoking a member's billing access when adding them elsewhere

add() deleted the member's row on any other account to satisfy a global unique that no longer exists. Adding someone to a second billing account now leaves the ...

KamoΒ·2mo ago
FixBillingService

Let a sub-org reach the account that pays for it

AccountSubscription deliberately separates the payer from the organization whose members consume the seats, and auto-provisioned accounts sit on the top-level K...

KamoΒ·2mo ago
August 10, 2026
FixBillingService

Charge what the catalog says, once, for the right quantity

Five defects that all moved real money, plus the sub-resource IDOR beneath them. Billing cycles. ANNUAL prices were sent to Stripe at the stored per-month rate...

KamoΒ·2mo ago
FixBillingService

Verify god mode against the database, not a forged header

AccountOrgScopeInterceptor short-circuited every org and member check on the raw X-God-Mode-Active header, and kamo-internal's billing proxy copies that header ...

KamoΒ·2mo ago
FixBillingService

CockroachDB-only SQL that PostgreSQL rejects

CockroachDB spells the text type STRING; PostgreSQL and YugabyteDB use TEXT. 25 casts across native queries were still emitting CAST(x AS STRING) and ::STRING, ...

KamoΒ·2mo ago
August 9, 2026
FixBillingService

Give each organization a real transaction boundary

StorageSnapshotSweep.catchUp carried @Transactional(REQUIRES_NEW) and was called from sweep() on the same bean. Spring applies @Transactional through a proxy, s...

KamoΒ·2mo ago
FixBillingService

Enforce self-or-owner on an account, not just the org boundary

Follow-up to the cross-org gate, now that the rule is decided: inside an organization you may manage your own billing account, and an organization owner may man...

KamoΒ·2mo ago
FixBillingService

Stop one organization reaching another organization billing

/api/billing/accounts scopes its listing by the X-Org-Id header, but every route beneath /{accountUid} took the id straight from the path and never checked who ...

KamoΒ·2mo ago
FixBillingService

Answer "is this sellable" from the app catalog, not the enum

Availability became operator-editable at runtime, so deriving it from ServiceType.getStage() meant publishing MLOS in Apps and Features left it invisible on the...

KamoΒ·2mo ago
FixBillingService

Validate add-on codes before they can grant an app

active_addon_codes was written straight from the request body. That was harmless while nothing read the column, but it is now an authorization input: an add-on ...

KamoΒ·2mo ago
August 8, 2026
FixBillingService

Hide unreleased apps from the Plans & Billing catalog

**************** back the tab where a customer chooses what to subscribe to, so it must not offer a product still in the Not Available list β€” the same rule the ...

KamoΒ·2mo ago
FixBillingService

Keep the is-prefix on PlatformAccountSummary's wire names too

Same Lombok/Jackson hazard as PlatformOrgRow: isTopLevel() loses its `is` on serialization, so the DTO put `topLevel`/`platformProduct` on the wire while the fr...

KamoΒ·2mo ago
FixBillingService

Keep the is-prefix on the wire for isTopLevel/isPlatformProduct

Lombok generates isTopLevel() for a `boolean isTopLevel` field and Jackson strips the `is` prefix, so the live endpoint was serializing `topLevel` and `platform...

KamoΒ·2mo ago
FixBillingService

Declare security matchers explicitly so the service can start

The service has not deployed since 2026-07-03; every pod since has crash-looped before the context loaded: This method cannot decide whether these patterns a...

KamoΒ·2mo ago
August 3, 2026
FixBillingService

Harden the kubectl download against flaky egress [skip ci]

dl.k8s.io over the runner's egress intermittently drops mid-transfer: curl: (56) OpenSSL SSL_read: decryption failed or bad record mac which fails the deploy ...

KamoΒ·2mo 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