KamoCRM

Live Change Log

See what we're building, in real-time. Every feature, fix, and improvement shipped across the platform.

June 8, 2026
FeatureConversionService

Preserve aspect ratio, never stretch non-square logos

Favicon PNG/ICO frames were produced with keepAspectRatio(false), stretching any non-square logo into a distorted square. Center-fit the logo on a transparent s...

Kamo·1d ago
FixSecurityService

Regenerate favicons on labeling save; sniff real logo type

provisionUpdate (run on every custom-labeling save) wrote config/css/manifest but never regenerated favicons — those were only produced by provisionFull. An org...

Kamo·1d ago
FixSecurityService

Seed globals.css from template when org folder lacks it

provisionUpdate (run on every color save) rewrote the org's css/globals.css in place, but that object only exists once provisionFull has copied it from the defa...

Kamo·1d ago
Fixkamo-internal

Show full logo with its real extension, not hardcoded .svg

The branding tab built logoFullUrl as logo-full.svg on mount, ignoring the org's logoFullExt. Full logos uploaded as png/jpg/etc. live at logo-full.{ext} in Min...

kamo·1d ago
FixKlusterServices

Refresh TLSStore every loop so newly-issued certs get served

update_tls_store() only ran at startup and on shared-storage imports, so a cert freshly issued by cert-manager (HTTP-01) was Ready with a tls-* secret but never...

Kamo·1d ago
FixKlusterServices

Give redirect-only route a backend so Traefik v3 enables it

Traefik v3 disables an IngressRoute router with services: [] when allowEmptyServices is off (as it is here), so the domain-agnostic HTTP->HTTPS redirect router ...

Kamo·1d ago
FixKlusterServices

Redirect all HTTP hosts to HTTPS + gate auto-cert to real org domains

Custom org domains (e.g. login.sign.pink) returned Traefik's bare "404 page not found" over plain HTTP: the only port-80 redirect router was hardcoded to *.kamo...

Kamo·1d ago
FeatureKlusterServices

Pre-seed sign.pink + www.sign.pink in STATIC_DOMAINS

sign.pink is a new apex domain (consumer e-signature brand / white-label Kamo tenant org). Pre-seed apex + www so a Let's Encrypt cert exists before first HTTPS...

Kamo·1d ago
FixConversionService

Persist conversion_error instead of failing silently

Both the template and regular upload conversion pipelines swallowed Docs conversion failures (logged only), leaving is_converted=false with no recorded reason —...

Kamo·1d ago
May 30, 2026
Featurekamo-internal

Full-width enterprise rewrite with live preview

LoanProductForm was a single narrow column (maxWidth: 880) with hardcoded English everywhere. Now uses the same enterprise pattern as the offer page: Layout: -...

kamo·1w ago
Featurekamo-internal

Two-column layout with live preview pane

The new-offer page was a tall narrow column on wide screens — wasted half the viewport. Now uses CSS Grid with the form on the left (5fr) and a live "Offer Prev...

kamo·1w ago
Refactorkamo-internal

Redesign new-offer page as two-column workspace + live preview

You asked for full real estate, modern, polished — last refactor put a single-column form inside a full-width shell, which is exactly the wide half-page-of-empt...

kamo·1w ago
May 29, 2026
Featurekamo-internal

Polish new-offer page — empty state, LOC badge, custom terms

Three UX gaps the offer page had after the prior refactor: 1. Empty state. When a market has no Loan Products yet, the dropdown used to silently render empt...

kamo·1w ago
Fixkamo-shared-library

Rename LoanRepository → PersonalLoanRepository

Spring Data JPA derives the repository bean name from the interface's simple class name, not from the @Repository("...") qualifier value, so the prior workaroun...

Kamo·1w ago
Fixkamo-internal

Add /commerce/personal-loans/new entry + polish market-scoped offer page

The QuickActionsBar "New Loan Offer" action pointed at /commerce/personal-loans/new but no such page existed, so Next.js routed to the dynamic [loanId] page wit...

kamo·1w ago
Refactorkamo-internal

Full-width enterprise polish across 10 pages

Adopts the modern enterprise pattern (gradient header + breadcrumbs + back arrow + full-height flex shell + card-grouped content on light gray canvas) used else...

kamo·1w ago
ChoreSecurityService

Trigger rebuild to pick up renamed PersonalLoan entity

The SecurityService image at 761019b was built before shared-lib d14dc54 (which renamed the personal-loans Loan entity to JPA name "PersonalLoan" to resolve the...

Kamo·1w ago
Featurekamo-internal

Expose PERSONAL_LOANS in commerce-type & engagement pickers

Adds PERSONAL_LOANS to the COMMERCE_TYPES and EngagementType lists so the new KamoLOS personal-loans market can be created from the markets/new and markets/edit...

kamo·1w ago
Fixkamo-shared-library

Avoid Loan / LoanRepository collision with mortgage app

KamoInitializerService failed to boot because two @Entity classes named 'Loan' and two repository classes named 'LoanRepository' both wanted to register the sam...

Kamo·1w ago
Featurekamo-internal

T6+T7 frontend polish + org reports + auto-pay UI

Frontend polish (T6): - New lib/format.ts: locale-aware Intl helpers — formatCurrency / formatDate / formatDateTime / formatPercentBps. Replaces hardcoded t...

kamo·1w ago
Featurekamo-shared-library

LoanChargeOffReasonCode (IRS 1099-C box 6) + audit search

- New LoanChargeOffReasonCode enum (A_BANKRUPTCY..H_OTHER) per IRC §6050P - Loan.chargeOffReasonCode column - **************** multi-filter @Query for regulator...

Kamo·1w ago
Featurekamo-shared-library

****************

Used by **************** to reactivate an existing PAUSED plan instead of creating a duplicate row that orphans the paused one.

Kamo·1w ago
May 28, 2026
Featurekamo-internal

/api/los proxy HMAC-signs identity headers

When LOS_PROXY_HMAC_SECRET env var is set, the proxy now computes **************** secret) and sends X-Proxy-Signature + X-Proxy-Timestamp alongside the X-Org-I...

kamo·1w ago
Performancekamo-shared-library

Paged repo queries + countByStatus for hot paths

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

Kamo·1w ago
Fixkamo-internal

Force email link clicks via capture-phase navigation

Reports show clicks on email-preview links silently doing nothing — hover shows the URL, no console errors, but the navigation never fires. That fingerprint poi...

kamo·1w ago
Featurekamo-internal

Org-side loan detail page + adjustments/promise API

- losApi: manualAdjust, waiveFee, promiseToPay - **************** full org-operations page * 4-up balance cards (current, principal, interest, next due) * M...

kamo·1w ago
Featurekamo-shared-library

LoanOrgStripeConnect + Loan tax/accrual fields + hot indexes

- New LoanOrgStripeConnect entity (one-per-org, holds stripeConnectedAccountId + Connect onboarding capabilities) + repository - Loan: stripeCustomerId (lazy-...

Kamo·1w ago
Fixkamo-internal

Let native target=_blank open the new tab, drop window.open

The previous fix intercepted the click and called window.open() — but popup blockers and extensions can block window.open even from a direct click handler, so t...

kamo·1w ago
Featurekamo-internal

P1 frontend — charge-off queue + audit timeline

- losApi: chargeOffQueue / confirmChargeOff / auditByLoan - **************** D120 review queue page; org user reviews each loan, adds a reason, clicks Confirm...

kamo·1w ago
Refactorkamo-shared-library

Loan.engagementUid → Long + originatingOrderUid

Engagement extends BaseEntity (Long PK) so engagementUid must be Long, not UUID — this is consistent with the existing AgreementDTO / WorkOrderDTO pattern of "L...

Kamo·1w ago
Featurekamo-internal

P0 hardening — forms, session resolve, payment methods

Forms (org-side): - **************** and /{productUid} edit pages - New LoanProductForm: basics / pricing / limits / terms / compliance sections, kind-aware...

kamo·1w ago
ChoreSecurityService

KamoLOS → KamoMLOS in comment references

The /Next.js/KamoLOS project (mortgage applicant flow) was renamed to KamoMLOS so the KamoLOS name could be reused for the new personal-loan service. These are ...

Kamo·1w ago
ChoreKlusterServices

Update subdomain map comment KamoLOS → KamoMLOS

The /Next.js/KamoLOS project was renamed to KamoMLOS (Kamo Mortgage Loan Origination System). The KamoLOS name is now used for the new personal-loan service. Th...

Kamo·1w ago
Featurekamo-internal

/api/los/* proxy route → KamoLOS via k8s DNS

Mirrors the /api/billing/[[...path]] BillingService proxy: - *** session resolved via Redis; X-Org-Id + X-Member-Id forwarded - /api/los/webhooks/* skip session...

kamo·1w ago
Featurekamo-internal

Add PERSONAL_LOANS commerce type front-end

- engagementTypeLabels: extend EngagementType union + vocabulary - MarketCardGrid: PERSONAL_LOANS color (#14b8a6) + Landmark icon + counter - Market detail page...

kamo·1w ago
Fixkamo-internal

Email-preview links open in a new tab again

The sanitizer already sets target="_blank" on every link, but the document-level click handler in NavigationInterceptor was firing for every link click — includ...

kamo·1w ago
Featurekamo-shared-library

Add PERSONAL_LOANS commerce type + entity package

- CommerceType.PERSONAL_LOANS + parallel EngagementType + vocabulary - BuiltinVendorCategories entries for personal-loan vendors - 15 personal_loans JPA entitie...

Kamo·1w ago
May 21, 2026
Featurekamo-internal

Photo-album uploads use the same WS pipeline as the Uploads tab

Extracts the doc-manager upload pipeline (hashing → dedup check → register-or-upload → WebSocket-driven conversion) into a reusable useImagingUploads hook. The ...

kamo·2w ago
Fixkamo-internal

Add /api/security/mortgage-apps catch-all proxy — 404 root cause

The kamo-internal app proxies every Java backend path through an explicit Next.js route handler (one per top-level segment: /commerce-markets, /pos, /leads, …)....

kamo·2w ago
Fixkamo-internal

/pipeline/{vertical}/{x} 404s — namespace was renamed to /commerce/

The /pipeline namespace has no routes in this app — every link going to /pipeline/applications/{x}, /pipeline/orders/{x}, /pipeline/engagements/{x}, /pipeline/s...

kamo·2w ago
FeatureSecurityService

Backfill program offerings for existing mortgage markets on boot

DataLoader now calls **************** after the AppMortgage-engagement backfill. Sweeps every existing MORTGAGE CommerceMarket and ensures its program Offerings...

Kamo·2w ago
Featurekamo-shared-library

Bootstrap mortgage program offerings on market create + boot backfill

When the user creates a CommerceMarket with commerceType=MORTGAGE — via the Markets & Fields settings tab — the market needs program Offerings under it for down...

Kamo·2w ago
FixSecurityService

Detach before replacing features collection in /org/domain

The previous fix wired the applied-model projection into **************** but called org.setFeatures(projected) on the still-managed entity. The Organization.fe...

Kamo·2w ago
Fixkamo-internal

Remove standalone Applications icon — LOS lives under Commerce

The mortgage application pipeline is one vertical of the commerce system, not a top-level nav. Loan officers, processors, and underwriters reach it via Commerce...

kamo·2w ago
FixSecurityService

Resolve ambiguous /org/domain handler — Commerce nav was disappearing

SecurityController had a second **************** that collided with **************** Spring rejected the request with "Ambiguous handler methods mapped" → 500 →...

Kamo·2w ago
Featurekamo-internal

Duplicate binders so users can fork without affecting the original

Adds a "Duplicate" action accessible from the binder list's context menu and from a new button in the editor header. The duplicate starts from the source binder...

kamo·2w ago
FeatureDocsService

Add POST ****************

Deep-copies a binder the requester can see (owned, shared, or template) into a fresh binder owned by the requester. Copies every item (DOC, SEPARATOR, GENERATED...

Kamo·2w ago
Featurekamo-internal

Mortgage Programs toggle + MORTGAGE engagement deep-link

- MortgageProgramsPanel now ships a real Switch on each program card with optimistic update + rollback on failure. Toggling a program calls PUT ************...

kamo·2w ago
FeatureSecurityService

PUT /programs/{code}/active + deprecate legacy mortgage POS endpoints

- MortgageProgramController gains PUT **************** with body {"isActive": bool}, gated on LOS_TAKE_APPLICATION. Delegates to **************** which upse...

Kamo·2w ago
Featurekamo-shared-library

Per-org enable/disable + deprecate legacy commerce-only mortgage path

- **************** upserts an OrgProgramOverride row with recordState.isActive=desired; listForOrg now AND's the base program's active flag with the overrid...

Kamo·2w ago
Live Change Log | KamoCRM | KamoCRM