KamoCRM

Live Change Log

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

18,407
Total Changes
6,538
Features
5,540
Fixes
30
Projects
Filter by project
All Projects18,407AIService276APIService177BillingService161ConversionService117DaemonService146DocsService240ESigService93EmailService622InitializerService344KBService162KlusterServices769MCPGatewayService277MediaService620RAGService79SecurityService1,997TranslateService62VOIPService265VectorService11kamo-apps26kamo-asterisk-support28kamo-capcha17kamo-capcha-widget4kamo-internal8,700kamo-login342kamo-marketing642kamo-nowww20kamo-register213kamo-shared-library1,826kamo-signer-monorepo57kamolos114
Filter by type
All TypesBuild23CI525Chore794Docs3,286Feature6,538Fix5,540Other1,001Performance174Refactor282Revert23Style45Test175Upgrade1
August 12, 2026
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·3mo ago
FeatureSecurityService

Sign former employees in to a restricted tier instead of refusing them

A team member whose employment is not ACTIVE was refused at the door with "Your account exists but is not active at this time." That was the wrong shape. A term...

Kamo·3mo 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·3mo 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·3mo 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·3mo ago
Featurekamo-internal

Confirm before stopping a recurring payment

Both cancel actions — a member's own seat and a group manager's plan — now ask first, naming the date cover runs to and, for a group, how many people keep their...

kamo·3mo ago
FeatureBillingService

Carry the renewal date on the coverage and group payloads

Both surfaces now report currentPeriodEnd and cancelAtPeriodEnd. The date is what a cancel confirmation actually needs to say — "you keep your seat until the en...

Kamo·3mo ago
Featurekamo-internal

Tell people when a bill needs them, and let them stop paying

A banner on the home page when a payment this person is responsible for has failed, linking straight to their billing page. Until now a failed payment showed up...

kamo·3mo ago
FeatureBillingService

One plan per organization, a 25-seat Enterprise ceiling, and a way to stop paying

The plan is now an organization-level decision and nothing else can override it. Letting a self-payer or a group manager pick their own reads like a kindness an...

Kamo·3mo ago
FeatureSecurityService

Approval-tier relay with role resolved from rights

THE ROLE IS DECIDED HERE, from the caller's rights and their relationship to the subject -- never from the request body. A body that could name its own role wou...

Kamo·3mo 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·3mo 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·3mo ago
Featurekamo-internal

Member Timecard tab and the HRS Timecards settings tab

The member tab is SELF-SERVICE ONLY and gated on identity, exactly like legal-compliance: its endpoints take no member id at all, so it is structurally incapabl...

kamo·3mo ago
Featurekamo-internal

/hr/attendance roster and the NavTop clock control

Replaces the HrTabPlaceholder body. The route, HR_TABS entry, MANAGE_TIMECARDS gate and tab i18n keys all already existed; nothing here registers anything. Ros...

kamo·3mo 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·3mo ago
Featurekamo-internal

BFF route for /api/security/timecards

TimecardService is ClusterIP with no ingress, so without this route the whole feature 404s in the browser while every service is healthy and every build is gree...

kamo·3mo ago
FeatureSecurityService

SecurityService relay to TimecardService

The authorization boundary. TimecardService holds the data and the engine but no session; this holds the session and decides who may do what, then relays. The e...

Kamo·3mo 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·3mo ago
August 11, 2026
FeatureInitializerService

KI registration and schema migration

Tables come from ddl-auto; this runner supplies only what Hibernate cannot -- the partial unique indexes on one open primary assignment and one open pay-rate wi...

Kamo·3mo ago
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·3mo 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·3mo 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·3mo ago
Featurekamo-internal

Deliver the org timezone to the browser

The client Organization model had no timezone field, useFormatters and next-intl are both configured with no timeZone, and timezoneService's backend call 404'd ...

kamo·3mo ago
FeatureSecurityService

GET ****************

timezoneService.ts has called this endpoint since it was written and it existed in no Java service; the client swallowed the 404 and resolved to UTC. Meanwhile ...

Kamo·3mo 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·3mo 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·3mo 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·3mo 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·3mo 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·3mo 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·3mo 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·3mo ago
Featurekamo-internal

Show members who pays for their seat, and stop offering a second one

The coverage endpoint shipped with translation keys and no component, so the question it answers — who pays for my seat — still had nowhere to be asked. SeatCov...

kamo·3mo ago
FeatureBillingService

Let a group's plan be cancelled, and stop double-paying for one person

Three gaps in what shipped last: A group with a plan could never be removed. delete() refuses while a live subscription exists — correct, since the group row i...

Kamo·3mo ago
Featurekamo-internal

A group you can put people on and pay for

Creating a group produced a name and nothing else — no way to add anyone, no way for its manager to choose a plan, nowhere to pay. Opening a group now shows who...

kamo·3mo ago
FeatureBillingService

Make billing groups work end to end, and stop self-pay charging for nothing

A group can now gather people, buy a plan on its manager's own card, and hand its seats out. None of that existed: the only operations were create, approve and ...

Kamo·3mo ago
FeatureInitializerService

Schema for groups that can actually pay

Three runners: BillingGroupRosterMigration creates billing_pay_group_members — whom a group means to pay for, before it has bought anything. org_id is denormal...

Kamo·3mo 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·3mo ago
Featurekamo-internal

The HR course editor, assignments grid and member course player

/hr/training replaces its placeholder with the two sub-tabs the brief asked for, and the member's Assigned Training grid gains the action column it was holding ...

kamo·3mo ago
FeatureDaemonService

The hourly training reminder tick

HOURLY at :10, unlike the legal sweep's daily 13:00. Training reminds each org at its OWN local send hour, and Organization.timezone spans 21 hours (Pacific/Hon...

Kamo·3mo ago
FeatureDocsService

The complete HR Training backend

Course authoring, publishing, assignment, the member player, server-side grading, WORM evidence and the reminder sweep — the whole module behind /api/docs/train...

Kamo·3mo 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·3mo ago
Featurekamo-internal

One member surface for both obligations, one badge for either

The member's compliance tab had two sub-tabs, Pending and Completed, for one kind of obligation. Those are a STATE, not a kind — so they collapse into a status ...

kamo·3mo ago
FeatureDocsService

The member-facing Training API

Registers com.kamo.z.shared.hr.training in @EnableJpaRepositories — @EntityScan is broad so the entities are found either way, but repositories are not. Two au...

Kamo·3mo ago
FeatureInitializerService

Create the HR Training schema

Registers com.kamo.z.shared.hr.training in the explicit @EnableJpaRepositories list — @EntityScan is broad so the entities are found either way, but repositorie...

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

Create billing_pay_groups explicitly, and undo the legacy collision

Creating it in a migration rather than leaving it to ddl-auto, which produced a half-built table when the entity was pointed at the pre-existing billing_groups.

Kamo·3mo ago
FeatureEmailService

Size each mailbox against the organization's storage

Dovecot now enforces a per-mailbox limit, and nothing was setting the column it reads. This writes it nightly, after the storage snapshot so the capacity being ...

Kamo·3mo ago
FeatureKlusterServices

Enforce storage quota on inbound delivery, and stop shipping the DB password

Object storage already refuses content that would take an organization past its ceiling, which covers every domain going through the object store. Inbound mail ...

Kamo·3mo ago
FeatureKlusterServices

Enforce storage quota on inbound delivery, and stop shipping the DB password

Object storage already refuses content that would take an organization past its ceiling, which covers every domain going through the object store. Inbound mail ...

Kamo·3mo ago
Featurekamo-internal

Let a member license their own seat from the console

The panel that closes the loop on self-pay. It appears only where the organization's policy permits it, and only for people who are not already buying on the or...

kamo·3mo 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