KamoCRM

Live Change Log

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

18,391
Total Changes
6,526
Features
5,537
Fixes
30
Projects
Filter by project
All Projects18,391AIService276APIService177BillingService161ConversionService117DaemonService146DocsService240ESigService93EmailService619InitializerService344KBService162KlusterServices769MCPGatewayService277MediaService620RAGService79SecurityService1,995TranslateService62VOIPService265VectorService11kamo-apps26kamo-asterisk-support28kamo-capcha17kamo-capcha-widget4kamo-internal8,691kamo-login342kamo-marketing642kamo-nowww20kamo-register213kamo-shared-library1,824kamo-signer-monorepo57kamolos114
Filter by type
All TypesBuild23CI525Chore794Docs3,286Feature6,526Fix5,537Other1,001Performance174Refactor281Revert23Style45Test175Upgrade1
August 19, 2026
Performancekamo-marketing

Stop shipping 1.8 MB of unresized backgrounds after hydration

ThemedBackground was the most expensive thing left on the homepage, and none of it looked like a bug. It rendered a raw <img> straight at the theme bucket, so t...

Kamo·2mo ago
Performancekamo-marketing

Stop the fold waiting on hydration, and clear the load window

The homepage shipped its whole fold invisible. Framer Motion serialises an `initial` prop into the prerendered HTML as an inline style, so the markup arrived wi...

Kamo·2mo ago
Performancekamo-marketing

Stop the analytics tracker hijacking every link but Home

Every page except the homepage took seconds to open, and the reason was never in this app's own navigation path: the server prerenders, prefetch payloads are co...

Kamo·2mo ago
Performancekamo-marketing

Drop the sitewide loading boundary that only secondary pages paid for

Every page except the homepage felt slow, which points straight at the (pages) subtree — and at something I put there. When 4fae924 added (pages)/loading.tsx ev...

Kamo·2mo ago
Performancekamo-marketing

Prerender the changelog count, refresh it on publish instead of on visit

Every visitor was fetching this number themselves. PreviewBanner lives in the shared layout, so on every page it hit /api/changelog/today after hydration, waite...

Kamo·2mo ago
Performancekamo-marketing

Stop prefetching a megabyte per page, and stop calling the backend for free

Two costs that were paid on every page, both found by following the reporter's own hunch about i18n and needless backend calls. PREFETCH VOLUME — a regression ...

Kamo·2mo ago
Performancekamo-marketing

Stop every page switch waiting on a redirect and a 2s fade-in

The prerendering work in 4fae924 fixed the server and the router, and the site still felt like it took 1-2 seconds to change pages. It was never the network. Tw...

Kamo·2mo ago
Performancekamo-marketing

Prerender the routes again and give a navigation something to paint

The locale layout resolved its messages with a bare getMessages(), which reads request headers and so opted the ENTIRE app out of static rendering. With no load...

Kamo·2mo ago
August 15, 2026
PerformanceSecurityService

Resolve each handler's platform annotation once

The interceptor is registered for /** so the annotation lookup ran on every request this service serves, sign-in included, and AnnotatedElementUtils walks the m...

Kamo·2mo ago
August 14, 2026
Performancekamo-internal

Ask for the unread count, not the whole folder tree

The mail badge needs one integer and was fetching every folder in the mailbox to find it, which on the IMAP providers is the most expensive call the mail backen...

kamo·2mo ago
Performancekamo-internal

Stop making the inbox wait on two lookups it can see the answer to

Two round trips still sat in front of a rendered inbox, and by this point they were the only thing left there — the folder tree and the first page already arriv...

kamo·2mo ago
Performancekamo-internal

Ask earlier, ask once, and stop asking for what has not changed

Three more things standing between opening /messages and seeing mail. Nothing was requested until the bundle had landed. /messages pulls several megabytes of J...

kamo·2mo ago
Performancekamo-internal

Stop paying for a key nothing reads, and stop waiting to ask

Three things were slowing /messages down before a single message was fetched. Every email call made a round trip to /api/generate-otk first and sent the result...

kamo·2mo ago
PerformanceEmailService

Stop opening every folder, and stop refetching every message

Two round-trip problems on the /messages critical path, both invisible in the code that caused them. listFolders opened each folder read-only to read two integ...

Kamo·2mo ago
August 12, 2026
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·3mo ago
August 10, 2026
PerformanceDaemonService

Refresh planner statistics after the weekly GeoLite rebuild

YugabyteDB does not auto-analyze, and the staging+rename swap replaces geolite_blocks wholesale -- so after every Sunday sync the planner had no statistics for ...

Kamo·3mo ago
PerformanceDaemonService

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

Give YugabyteDB real resources and pin its memory

It was running on LESS than the CockroachDB it replaced -- 20Gi/6cpu against CockroachDB's 32Gi/8cpu -- while needing more, because YSQL runs a separate Postgre...

Kamo·3mo ago
PerformanceKlusterServices

Give YugabyteDB real resources and pin its memory

It was running on LESS than the CockroachDB it replaced -- 20Gi/6cpu against CockroachDB's 32Gi/8cpu -- while needing more, because YSQL runs a separate Postgre...

Kamo·3mo ago
August 9, 2026
Performancekamo-internal

Hash with BLAKE3 only, so skipping the upload actually saves time

Dedup worked — the server logged 'linked WITHOUT upload' and 358 MB never left the machine — but the member still waited, because computing SHA3-256 alongside B...

kamo·3mo ago
PerformanceMediaService

Accept a BLAKE3-only claim so dedup is faster than uploading

The link endpoint demanded both hashes. A browser has no fast SHA3-256, so proving it already had a 358 MB file took ~20 seconds against an 18.8 second upload —...

Kamo·3mo ago
Performancekamo-shared-library

Match stored content on BLAKE3 alone, so a browser can afford to ask

Proving possession required both hashes, and a browser has no fast SHA3-256 — js-sha3 is pure JavaScript at ~25 MB/s. Measured on a 358 MB video that was ~20 se...

Kamo·3mo ago
Performancekamo-shared-library

Read the latest snapshot date without loading the history

A summary needs one date. It was reading it by loading a two-year range of snapshots and taking the max — five domains times every day of history, on every page...

Kamo·3mo ago
August 8, 2026
PerformanceSecurityService

One plan-matrix scan per app-catalog request

Also drops the now-unused DevelopmentStageType import and corrects the auto-provision comment, which still described the stage rule the catalog replaced.

Kamo·3mo ago
Performancekamo-shared-library

Answer the plan-matrix question for every app in one pass

The Apps & Features tab asks whether each app appears in the plan matrix, and the per-app form scans the plan-feature and add-on tables once per app — two dozen...

Kamo·3mo ago
August 5, 2026
PerformanceVOIPService

Stop re-querying call history per extension when the provider is instance-wide

RingCentral's endpoint is extension/~ and ignores the argument, so it returns the same log for every extension. Once a page adds nothing new, the remaining exte...

Kamo·3mo ago
July 6, 2026
June 26, 2026
PerformanceInitializerService

Stop per-boot customer_id FK tug-of-war in SchemaCleanupRunner

Remove the stale RetailCustomer->Account cleanup drops of commerce_carts.customer_id, **************** and **************** Those columns are now live, Hibernat...

Kamo·4mo ago
June 21, 2026
Performancekamo-capcha

Lower PoW difficulty (cost 1000, counter 2000-4000)

Solve cost is the product of CHALLENGE_COST x counter range; both were over-cranked (~37.5M PBKDF2 rounds, ~40-75x a stock Capcha), making the widget slow on lo...

Kamo·4mo ago
May 28, 2026
Performancekamolos

Tier 2 — Hikari + RestTemplate timeouts + Stripe SDK + Redis cache

- RestClientConfig: single shared RestTemplate bean with 5s connect / 30s read timeouts. MediaServiceClient / NotificationDispatchService / OfacSanctionsSer...

Kamo·5mo ago
Performancekamo-shared-library

Paged repo queries + countByStatus for hot paths

- LoanRepository: countByStatus / countByOrganizationAndStatus + Page<Loan> findByStatus(...) / **************** / **************** + **************** for...

Kamo·5mo ago
May 15, 2026
Performancekamo-internal

Merge partial DTOs into local state, drop refetch-after-patch

Every edit-style autosave (name fields, employment, assets, liabilities, REO, declarations, military, HMDA demographics, originator) used to issue a full mortga...

kamo·5mo ago
Performancekamo-shared-library

Collapse pipeline kanban N+1 to a single grouped count query

listForOrganization() used to issue one condition-fetch per loan (201 queries at 200 loans). Now a single grouped JPQL aggregate keyed by loanFile.uid projects ...

Kamo·5mo ago
April 25, 2026
PerformanceMediaService

Store geo on ticket at creation, drop GeoLite reads

**************** now captures the visitor's geo once (via GeoLookupService) and persists ip/country/city/subdivision on the SupportTicket itself. SupportTicket...

Kamo·6mo ago
PerformanceMediaService

Bulk-load visitors and skip GeoLite lookup in list

The /api/support/tickets list endpoint was running, per page of 20 rows: - 20 **************** calls (N+1) - 20 calls into GeoLookupService.lookup, each of ...

Kamo·6mo ago
Performancekamo-shared-library

Add findBySessionGuidIn for bulk loading

Used by the support-ticket list endpoint to fetch all visitors for a page in one query instead of N separate findBySessionGuid calls.

Kamo·6mo ago
March 12, 2026
PerformanceMediaService

Skip DB member lookup for messages auth check

Extract getMemberIdFromRequest() that reads memberID from the Redis session without hitting the DB. Use it in getMessages() instead of getCurrentMember() — the ...

Kamo·8mo ago
Performancekamo-internal

Eliminate OTK Redis overhead and proxy log noise for message fetches

- Bypass OTK generation in the MediaService proxy route: forward the *** cookie directly instead of generating a one-time key, removing 4 Redis round-trips ...

kamo·8mo ago
PerformanceMediaService

Eliminate per-request logging overhead and async TTL refresh

- k8s configmap (the actual production config): lower security/hikari logging from INFO/DEBUG to WARN, add HikariCP pool config (max 20) - KSessionService: st...

Kamo·8mo ago
PerformanceMediaService

Reduce log noise and tune connection pool

- Lower Spring Security from TRACE to WARN and HikariCP from DEBUG to WARN — eliminates dozens of synchronous log writes per request - Add explicit HikariCP p...

Kamo·8mo ago
Performancekamo-shared-library

Fetch parent message in same query to eliminate reply N+1

Alias m.msg and LEFT JOIN FETCH msg.parent so that threaded reply messages have their parent loaded in the initial query rather than triggering a separate SELEC...

Kamo·8mo ago
Performancekamo-internal

Improve chat message loading performance

- Cache getCurrentMemberId() result in a ref to avoid repeated /api/user-info calls on every WebSocket message and typing indicator - Parallelize message hist...

kamo·8mo ago
PerformanceMediaService

Remove per-message logging from chat message endpoint

Remove System.out.println calls inside the message stream map that were firing once per message (100 I/O operations per request), and the final log that streame...

Kamo·8mo ago
Performancekamo-shared-library

Fix N+1 query and add composite index for chat message loading

- Add LEFT JOIN FETCH m.msg to both repository queries to eagerly load MediaObjMsg in the same query, eliminating up to 100 extra SQL queries per chat windo...

Kamo·8mo ago
March 11, 2026
PerformanceSecurityService

Batch-load custom form data in getAllLeads (eliminate N+1)

Replace per-lead getCustomFormDataForLead calls (N+1 queries) with a single batch load via getCustomFormDataForLeads, grouped by lead ID using a Map lookup when...

Kamo·8mo ago
Performancekamo-shared-library

Eliminate full-table scan and N+1 queries on leads endpoint

- LeadRepository: add findByOrganizationId JPQL query (uses ORG_ID index) instead of loading entire LEADS table and filtering in Java - LeadCustomFormDataRepo...

Kamo·8mo ago
January 3, 2026
Performancekamo-marketing

Remove particle effects following mouse coder to improve performance

snadjafinia·10mo 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