KamoCRM

Live Change Log

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

15,120
Total Changes
5,169
Features
4,935
Fixes
30
Projects
Filter by project
All Projects15,120AIService197APIService161BillingService143ConversionService107DaemonService129DocsService215ESigService88EmailService518InitializerService318KBService105KlusterServices697MCPGatewayService85MediaService546RAGService71SecurityService1,658TranslateService55VOIPService205VectorService11kamo-apps25kamo-asterisk-support24kamo-capcha17kamo-capcha-widget4kamo-internal6,937kamo-login330kamo-marketing625kamo-nowww20kamo-register213kamo-shared-library1,455kamo-signer-monorepo53kamolos108
Filter by type
All TypesBuild11CI523Chore738Docs2,167Feature5,169Fix4,935Other986Performance157Refactor274Revert23Style42Test94Upgrade1
August 14, 2026
Featurekamo-shared-library

Carry whether a ticket is one of the items the support badge counts

The navtop badge and the ticket list were answering different questions and nobody could tell. The badge counts items awaiting attention — overwhelmingly ticket...

Kamo·1mo ago
Featurekamo-shared-library

The payroll-provider domain behind the timecard engine

Adds the persistence spine for connecting an organization's timecards to a third-party payroll system: the connection and its encrypted per-org config, the OAut...

Kamo·1mo ago
August 13, 2026
Featurekamo-shared-library

Count unseen messages for a viewer who is not in the conversation

Unread has always been derived from the viewer's own MediaSessionMember row, so a conversation they had not joined produced no count at all. On a support queue ...

Kamo·1mo ago
Featurekamo-shared-library

A punch can be voided without being deleted

Four nullable columns and a second write-once transition on TimecardPunch. A void says the punch should never have existed — a double tap on the clock, an aband...

Kamo·1mo ago
August 12, 2026
Fixkamo-shared-library

Quote the feed queries' aliases, and stop counting your own support messages against you

Two independent defects in the Chats feed, both invisible from the Java side. The native chat/support/social queries aliased columns in camelCase without quoti...

Kamo·1mo ago
Featurekamo-shared-library

An audit trail for accounts, and a directory that includes non-staff

ACCOUNT_HISTORY records what happens to an account the way LEAD_HISTORY records what happens to a lead — deliberately the same columns, because the internal sit...

Kamo·1mo ago
Performancekamo-shared-library

Fetch the summary slices' to-one associations and count instead of scanning

The Overview's attention and recent slices read a title per row off a LAZY @ManyToOne, costing up to 16 extra selects per block under open-session-in-view. All ...

Kamo·1mo ago
Featurekamo-shared-library

Per-member overdue rollup for the compliance matrix

The HR Overview's matrix branches on `row.overdue > 0`, but the legal and training rollups shipped with that field hardcoded to 0 — a branch that could never be...

Kamo·1mo ago
Featurekamo-shared-library

Bounded count/sum/recent queries for one org+assoc live set

HrResourceSummaryService was materialising an org's entire non-hidden Img collection into memory to compute a count, a byte sum and a 5-row recent slice. Adds c...

Kamo·1mo ago
Featurekamo-shared-library

Summary queries for the HR Overview

Status histograms, overdue slices and per-member rollups for legal and training, plus template/course status counts. No entity change.

Kamo·1mo ago
Featurekamo-shared-library

Org configuration, holiday calendars and schedules

TimecardOrgConfig holds the workweek, workday boundary, rounding, rule-set pointers and the review switches. Nothing in it is read at calculation time — every v...

Kamo·1mo ago
Featurekamo-shared-library

Carry the adjustment reason on the punch itself

A corrected or inserted time now records WHY on the wage record rather than only in the audit log. Under Anderson v. Mt. Clemens Pottery an employer with inadeq...

Kamo·1mo ago
Featurekamo-shared-library

Add the meal start deadline to the break rule

California requires the first meal to BEGIN before the end of the fifth hour. A 30-minute meal taken at hour seven is a full violation even though it was the ri...

Kamo·1mo ago
Featurekamo-shared-library

Pay periods, breaks, premiums, labor accounts, accruals, export

Batches the remaining wage-and-hour schema into one shared-lib change so the whole domain lands in a single KamoInitializer run rather than a migration per phas...

Kamo·1mo ago
Featurekamo-shared-library

Exception model and detector

Makes the blockingExceptions gate real. Until now the transition table read a count that nothing wrote, so every timecard looked clean and 'a missing punch is n...

Kamo·1mo ago
Featurekamo-shared-library

APPROVE_TIMECARD_ADJUSTMENTS (197) and FINALIZE_PAY_PERIODS (198)

Split so separation of duties is expressible: whoever approves a timecard is not automatically whoever may close a pay period over it. MANAGE_TIMECARDS (183) st...

Kamo·1mo ago
Featurekamo-shared-library

The approval tier state machine

Employee submits -> manager approves -> payroll closes, per the owner's decision. Four rules, enforced in a pure transition table and pinned by 25 tests: 1. A...

Kamo·1mo ago
Featurekamo-shared-library

Database-clock accessor on the punch repository

Every punch instant comes from the DB, never the JVM: pods restart and node clocks skew, and a wage record whose ordering depends on which pod answered is not a...

Kamo·1mo ago
Featurekamo-shared-library

Workday bucketing, stage 2 of the pipeline

Resolved intervals become per-business-date seconds, ready for the allocator. An interval is SPLIT at every workday boundary it crosses: a 22:00-06:00 shift un...

Kamo·1mo ago
August 11, 2026
Featurekamo-shared-library

Workweek and workday boundaries

The workweek is the FLSA overtime unit -- a fixed, regularly recurring 168-hour period -- and it is NOT the pay period. A biweekly period holds exactly two work...

Kamo·1mo ago
Featurekamo-shared-library

Interval resolution, stage 1 of the calculation pipeline

Punches become resolved spans. Pure, total, and over value types rather than entities so every stage is fixture-testable with no persistence context. Durations...

Kamo·1mo ago
Featurekamo-shared-library

Non-pyramiding overtime allocator with jurisdiction presets

Rules are DATA on the RequirementRule shape already used in this library, not code branches, so California is a configuration row instead of a rewrite. Allocat...

Kamo·1mo ago
Featurekamo-shared-library

WorkSite, the jurisdiction anchor

Named WorkSite, not WorkLocation: TeamMember.workLocation is an existing office/remote enum and a second symbol by that name would collide in every grep. zoneI...

Kamo·1mo ago
Featurekamo-shared-library

Employment and effective-dated assignment revisions

Punches will reference an ASSIGNMENT, not a member. That is what makes concurrent positions, the 29 CFR 778.115 weighted-average regular rate, multi-site jurisd...

Kamo·1mo ago
Featurekamo-shared-library

Effective-dated, append-only pay rate

No employee compensation existed anywhere on this platform before this entity. It is required: overtime is computed against the FLSA regular rate, CA requires t...

Kamo·1mo ago
Featurekamo-shared-library

Append-only punch log and audit event

Both served by NARROW Repository interfaces, not JpaRepository: deleteAllInBatch and bulk JPQL bypass entity callbacks, so the interface shape is what makes app...

Kamo·1mo ago
Featurekamo-shared-library

Timezone-of-record resolver

Authority order work site -> member -> org -> UTC. The work site wins because wage-and-hour rules follow where the work is PERFORMED. A production census this ...

Kamo·1mo ago
Featurekamo-shared-library

Shared WORM refusal guard

@Column(updatable=false) does NOT enforce immutability -- Hibernate silently omits the column from the UPDATE and the stale write looks like it succeeded. The o...

Kamo·1mo ago
Featurekamo-shared-library

Domain enums and point-in-time version resolver

Enums are all @Enumerated(STRING) at the call site: ORDINAL emits a numeric range CHECK containing AND, which SchemaCleanupRunner's IN-list sweep deliberately s...

Kamo·1mo ago
Featurekamo-shared-library

Let a billing group be its own payer

A group could be named and nothing else. Its subscription was never set — nothing in the platform called setSubscription — so subscription_uid stayed null forev...

Kamo·1mo ago
Featurekamo-shared-library

The four training email templates

Same constant/dotted-key split as the HR legal family: the CONSTANT is the filename stem, the templateKey the platform SENDS is the dotted value inside each .js...

Kamo·1mo ago
Featurekamo-shared-library

Stream document uploads and add the HR Training schema

ImageService gains uploadDocumentStreaming, the streaming counterpart of uploadDocument. The buffered form cannot express a large upload at all: readInputStream...

Kamo·1mo ago
Fixkamo-shared-library

Recreate a durable consumer whose stored filter no longer matches

A durable JetStream consumer keeps the filter subject it was created with for the life of the stream. When the owning code later changes that subject, jnats ref...

Kamo·1mo ago
Fixkamo-shared-library

Stop the pay-group entity sitting on a legacy table

BillingGroup was mapped to billing_groups. That table already existed — one of a seven-table subsystem (billing_group_members, _subscriptions, _licenses, _invoi...

Kamo·1mo ago
Fixkamo-shared-library

Never let the quota service stop a service from starting

StorageQuotaService took its five repositories as required constructor arguments. Services in this estate component-scan com.kamo with a wildcard but declare an...

Kamo·1mo ago
Testkamo-shared-library

Pin how the pool divides into per-mailbox limits

Dovecot needs a byte figure per mailbox, but storage is one organization-wide pool across eighteen domains. The division has to hold one property above all — th...

Kamo·1mo ago
Featurekamo-shared-library

Make a failed payment mean something

PAST_DUE counted as fully live in both entitlement resolvers, with no timestamp and no cap, so a customer whose card failed kept every feature for as long as St...

Kamo·1mo ago
Testkamo-shared-library

Pin the delegation-mode semantics

These predicates are what the surfaces hide themselves on, so getting one wrong either offers a button that cannot work or silently permits a charge the owner m...

Kamo·1mo ago
Featurekamo-shared-library

Let members and groups pay for themselves, under the owner's rules

Three things were missing and one was actively harmful. account_members carried a global unique on member_id — a member could administer exactly ONE billing ac...

Kamo·1mo ago
Featurekamo-shared-library

Show what turning off fail-open would cost

kamo.entitlement.fail-open grants any app the plan matrix never mentions. It is documented as a temporary valve for the catalog backfill — turn it off once the ...

Kamo·1mo ago
Featurekamo-shared-library

Opt-in auto-expand with a ceiling

Two columns on the subscription that holds the blocks: whether to buy another one automatically when the organization runs out of room, and the most it may ever...

Kamo·1mo ago
Featurekamo-shared-library

Record what each Stripe price was created with

The mapping stored only which price id to use, so a catalog price change could not even be noticed. ensurePlanPrices short-circuited on the row's existence and ...

Kamo·1mo ago
Featurekamo-shared-library

Give the storage allowance an effect

Storage was measured across nineteen domains, nightly, with a build-failing coverage test — and nothing anywhere computed an allowance or refused a byte. The pl...

Kamo·1mo ago
Featurekamo-shared-library

Give add-ons a unit size and a purchasable quantity

An add-on's unit only ever existed as prose inside its description ("Each unit adds 25 GB") and as a hardcoded constant in the marketing site, so nothing could ...

Kamo·1mo ago
August 10, 2026
Featurekamo-shared-library

Durable record of a conversation the client raised by itself

MediaSessionMember gains AUTO_OPENED_AT, beside msgIdLastViewed because it is the same grain — a fact about one member's relationship to one session. That one a...

Kamo·1mo ago
Stylekamo-shared-library

Restore the CRLF endings on the attendee repository

The previous commit rewrote the file through a script that normalised its line endings, so a twelve-line addition arrived as a fifty-line rewrite. That buries t...

Kamo·1mo ago
Featurekamo-shared-library

Batched guest lookup, and delete-by-event

The event dialog shows who an event is with, and the list endpoint returns a month of events at a time. Asking for guests per event is a query per row; findByEv...

Kamo·1mo ago
Featurekamo-shared-library

AUTO_ASSIGNMENT strategy and a durable record of an unseen handover

AUTO_ASSIGNMENT(3) is appended to SupportAssignmentStrategyType — assign immediately to an agent who is genuinely online, preferring whoever holds the least wor...

Kamo·1mo ago
Featurekamo-shared-library

Record when an account was created

Account carried no creation timestamp at all — not a null column, no column. The account list has a Date Created column and orders by it, so that column has bee...

Kamo·1mo ago
Performancekamo-shared-library

Geolite range index must be ASC, not YugabyteDB's default HASH

The IP lookup is a range scan: WHERE network_start <= ? ORDER BY network_start DESC LIMIT 1 YugabyteDB partitions the LEADING index column by HASH unless tol...

Kamo·1mo 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