KamoCRM

Live Change Log

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

July 13, 2026
Docskamo-internal

Update Microsoft 365 setup instructions for Graph app-only

The M365 help described registering a per-org Azure app (client secret, redirect URI) — stale: Kamo uses one platform-verified multi-tenant app, so customers ju...

kamo·40m ago
FeatureEmailService

Microsoft 365 mail via Microsoft Graph app-only (zero per-mailbox setup)

Microsoft 365 mail now reads/sends through Microsoft Graph app-only (Mail.ReadWrite/Mail.Send application permissions) instead of IMAP — one app credential cove...

Kamo·49m ago
Featurekamo-shared-library

GraphMessageIdMap entity for Microsoft 365 Graph mail id mapping

Maps opaque Microsoft Graph message ids to stable synthetic numeric UIDs per mailbox, so Graph mailboxes flow through the existing numeric-uid mail contract (co...

Kamo·49m ago
FixSecurityService

Raise memory 1Gi→2Gi; pod idled at ~900Mi and OOM-killed during background uploads

Kamo·4h ago
July 12, 2026
FeatureDaemonService

Bump GENERATOR_VERSION 7 — backfill GBIF fauna into all cities

The bird engine now consumes the fauna block, so backfill it everywhere: the fill job re-drains stale rows at 24/min (user-requested cities first), so real loca...

Kamo·1d ago
FeatureDaemonService

Sample locally-common birds from GBIF into city fauna

FaunaClient (mirrors PetrologyClient): GBIF occurrence facet on class Aves in a ~27km box around the city → top ~10 species by record count → resolve taxonomy (...

Kamo·1d ago
FeatureDaemonService

63 US-ecoregion signature flora overrides (fully populate the biomes)

Cities within a state looked the same because flora came from just 15 coarse biome defaults (+1 Mojave override). Now curated real signature species for 63 US e...

Kamo·1d ago
FixDaemonService

Crystalline/metamorphic basement classifies correctly (was VOLCANIC)

Macrostrat 'metamorphic and undivided crystalline (...may include volcanic...)' tripped the volcan substring; check metamorphic/crystalline before volcanic. Als...

Kamo·1d ago
FixDaemonService

Ridge petrology search to 25km, no relief gate

The gazetteer point often sits in the valley floor with the range 15-20km off; the 15km search + relief gate missed them (Yucca Valley returned alluvium despite...

Kamo·1d ago
FixDaemonService

Petrology reads the ridge bedrock, not the valley floor

A town centroid usually sits on valley ALLUVIUM while the mountains the scene draws are bedrock — so a granite-ringed desert town returned 'alluvium' and got no...

Kamo·1d ago
FeatureDaemonService

Petrology (Macrostrat) + roads (.trf) + waterfalls (.hyf) — level up the KamoUniverse systems

GLiM never downloaded (PANGAEA 404s; KamoUniverse itself falls back to default lithology), so petrology comes from the Macrostrat global geologic-map API: per-p...

Kamo·1d ago
FixSecurityService

Register mlos.notification JPA repos so SecurityService starts

EconsentService autowires DisclosureTextRepository **************** but that package was absent from @EnableJpaRepositories — the context failed to start, Crash...

Kamo·1d ago
FeatureDaemonService

City-scene sampler over the KamoUniverse earth tiles

- EdtTile: byte-exact reader for EDT4 tiles (Copernicus DEM + ESA WorldCover + WorldClim + HydroSHEDS + RESOLVE ecoregions + ocean mask), memory-mapped, offse...

Kamo·1d ago
FeatureSecurityService

Expose full geo fields + city-scene profile API

- geoip/me now returns **************** (already loaded by the single block+location lookup, previously discarded) — powers city scenes and client personali...

Kamo·1d ago
Featurekamo-shared-library

CitySceneProfile entity + GeoLite city-lookup indexes for city-based portal scenes

- CitySceneProfile (city_scene_profile): per-city environmental scene factors (terrain/relief/silhouette, climate/koppen, hydrology, RESOLVE ecoregion + flo...

Kamo·1d ago
FeatureSecurityService

E-consent with WRITTEN ESIGN Act text + the real credit-bureau adapter rail — no owner input required

E-CONSENT: full ESIGN Act §101(c) disclosure authored in-code (scope of consent, right to paper copies, right to withdraw + effect, contact upkeep, hardware/sof...

Kamo·1d ago
July 11, 2026
FixSecurityService

Prepare-signin authenticates on api.<root> — the auth path can't resolve the myloan.* alias

Same constraint as in-cluster login: provider resolution keys on the canonical api host, not the portal alias, so a correct password still 401'd.

Kamo·2d ago
FixESigService

AntPathRequestMatcher — immune to multi-servlet contexts

Belt-and-braces with the shared-lib SoapClientOnlyGuard (c4a3b2c): the 891c58c build raced the guard's push into shared-lib main and kept crash-looping on 'more...

Kamo·2d ago
FeatureSecurityService

Account bridge — email check, existing-user sign-in provisioning, portal registration

Owner flow: after the funnel captures full name + contact, the next step keys on EMAIL. /portal/account/check → exists?; /prepare-signin verifies the password t...

Kamo·2d ago
ChoreESigService

Rebuild for shared-lib servlet-bean guard (c4a3b2c)

Kamo·2d ago
Fixkamo-shared-library

The servlet guard must define the SERVLET bean — Boot conditions on the type, not the registration

f8bcc82's ServletRegistrationBean alone name-collided with the auto-config **************** WebServicesAutoConfiguration's bean is **************** Define the s...

Kamo·2d ago
ChoreESigService

Rebuild for shared-lib SoapClientOnlyGuard (f8bcc82) — servlet guard clears the crash-loop

Kamo·2d ago
Fixkamo-shared-library

Disabled MessageDispatcherServlet registration — kills the multi-servlet landmine for real

Removing the web-services STARTER (55eae0a) was not enough: spring-ws-core itself carries MessageDispatcherServlet, and Boot's WebServicesAutoConfiguration cond...

Kamo·2d ago
ChoreESigService

Rebuild for shared-lib client-only spring-ws (55eae0a) — clears the multi-servlet crash-loop

Kamo·2d ago
Fixkamo-shared-library

Spring-ws CLIENT-ONLY — the server starter made every consuming service multi-servlet

**************** auto-registers a MessageDispatcherServlet in EVERY service that depends on shared-lib; with Spring Security 6 that breaks any string requestMat...

Kamo·2d ago
FeatureSecurityService

Closing eSign through the NATIVE engine — envelopes actually send now

Recording a disclosure e-sign envelope was v1 metadata-only. Now, when the tenant's ESIGN vendor rail resolves to KAMO_NATIVE (per-market integrations config — ...

Kamo·2d ago
FeatureESigService

Non-metered internal platform-envelopes endpoint — DISCLOSURE-context signing rail

Platform-internal envelopes (mortgage disclosure/closing signing) are product, not the tenant's programmatic API usage: tagged MANUAL so completed signatures ne...

Kamo·2d ago
ChoreEmailService

Rebuild for shared-lib LOAN_STATUS_UPDATE canonical template (9fab88c)

Kamo·2d ago
Featurekamo-shared-library

LOAN_STATUS_UPDATE canonical template — borrower notified at every loan-file stage change

Kamo·2d ago
ChoreSecurityService

Rebuild for shared-lib loan-file PATCH null-guards (5dabd1a)

Kamo·2d ago
Fixkamo-shared-library

UpdateLoanFile PATCH must not null absent fields — status-only patch wiped loanNumber/dates

Any partial loan-file patch (the portal's submit sends only {statusId:2}) unconditionally overwrote loanNumber, channelId, and every lifecycle date with null. G...

Kamo·2d ago
Fixkamo-internal

Never render literal "null" in lead view header name

The header and headerName memo built the contact name with template literals, so a NULL middle/last name stringified to the word "null" (e.g. "Sage null"). Buil...

kamo·2d ago
ChoreEmailService

Rebuild for shared-lib RESUME_PORTAL_LINK canonical template

Kamo·2d ago
FeatureSecurityService

Leads-first resume rail — signed magic links, contact recovery, lead snapshot

- PortalResumeService: 30-day HMAC token (PRESUME|guid|orgId|exp, keyed off the cluster internal.auth.secret — no new secret); mails RESUME_PORTAL_LINK. - POS...

Kamo·2d ago
Featurekamo-shared-library

RESUME_PORTAL_LINK canonical template — borrower magic-link to continue on any device

Kamo·2d ago
ChoreMediaService

Rebuild for shared-lib GeoLite bounded lookup (2-4ms hit+miss)

Picks up kamo-shared-library 011a73e — GeoLookupService's findByIpInRange now LIMIT-1-bounded instead of scanning to exhaustion on gap/high IPs (measured 5-13s ...

Kamo·2d ago
FixVOIPService

Guard /internal/voip with InternalAuthFilter as documented — it 401'd on session auth

VoipInternalSyncController always documented InternalAuthFilter as its guard, but /internal/voip was never in PROTECTED_PREFIXES nor excluded from the OTK sessi...

Kamo·2d ago
FixDaemonService

VoipGlobalSyncJob stamps the MLOS internal-auth secret VOIP actually validates

After the hostname fix the job 401'd: VOIP's InternalAuthFilter checks the mlos-internal-auth value, but the job read internal.auth.secret, which in DaemonServi...

Kamo·2d ago
July 10, 2026
FixDaemonService

VoipGlobalSyncJob targeted a nonexistent host — kamovoip-service, not voip-service

Every minute the job failed DNS on **************** the actual Service (and what StewardNotifier already uses) is kamovoip-service. Fixed the configmap default ...

Kamo·2d ago
FeatureSecurityService

Expose US state/region from GeoLite lookups

GeoLookupResult gains subdivisionCode/subdivisionName (GeoLite2 subdivision_1 = US state incl. DC; territories PR/GU/VI/AS/MP arrive as countryCode with no usab...

Kamo·2d ago
Fixkamo-shared-library

Bound IP block lookup to a single indexed row

findByIpInRange's two-sided range predicate forced CockroachDB to scan every block with networkStart <= ip whenever the IP fell in a gap (private/bogon/ spoofed...

Kamo·2d ago
FixDaemonService

Re-parent geolite config under daemon: so the weekly sync actually runs

Commit 53eed7b re-parented the geolite block under internal: while the code reads daemon.geolite.* — with SPRING_CONFIG_LOCATION replacing classpath defaults, G...

Kamo·2d ago
FeatureSecurityService

Anonymous GET /portal/assigned-lo — accepting LO identity for the guid's lead

Powers the borrower portal's top-left LO card the moment an LO accepts the lead (pre-login, pre-application): guid header + org host → lead → assignedTeamMember...

Kamo·2d ago
FixDaemonService

Boot crash — Ant matchers for the multi-servlet context (spring-ws /services/*)

MVC-implicit string requestMatchers are rejected by Spring Security 6 once the MeridianLink integration's MessageDispatcherServlet joins the DispatcherServlet —...

Kamo·2d ago
ChoreEmailService

Rebuild on shared-lib resolver hotfix

Kamo·2d ago
ChoreMediaService

Rebuild on shared-lib resolver hotfix (boot crash: LenderProfileRepository)

Kamo·2d ago
Otherkamo-shared-library

MortgageProviderResolver deps → ObjectProvider — was crash-looping MediaService

The @Service is component-scanned by every com.kamo service, but mlos.config repositories only exist where @EnableJpaRepositories registers them. Hard construct...

Kamo·2d ago
ChoreEmailService

Rebuild to bundle MEET_YOUR_LO canonical template

Kamo·2d ago
FeatureSecurityService

'Meet your loan officer' — the borrower hears the moment their lead is accepted

On accept (ASSIGNED), best-effort MEET_YOUR_LO email to the mortgage lead's borrower: the accepting LO's real name + NMLS + email + a continue-application link....

Kamo·2d ago
Featurekamo-shared-library

MEET_YOUR_LO canonical template — borrower intro when an LO accepts their lead

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