Set site region + use node-local MinIO per pod
- Add kamo.minio.region (MINIO_REGION, default us-west-ca-s-1) so SigV4 signatures match the server's enforced site region; fixes background upload and sett...
Sign requests with configurable site region
MinIO now enforces MINIO_SITE_REGION (us-west-ca-s-1) in the SigV4 authorization scope since site replication was enabled. The client was built without a region...
Drop background images that 404 instead of showing a broken frame
Track failed background image loads and filter them out of the Swiper carousel, so an incompletely provisioned theme (e.g. optionone, whose bg/2.webp was never ...
Remove the 2s intro/loading animation screen
Drop showIntro/introComplete state, the 2s intro timer effect, and the branded early-return loading screen. The page now renders straight into the background + ...
Trial chip on NavPri (white/red, tooltip=expiry) + homepage chip red; remove NavTop chip
Never return 401 from proxy (was logging users out on enter-as); degrade to empty
Panel bleeds off-page left so its edge never shows on bounce; card fades ~250ms sooner
- Welcome/recover panel now extends --welcome-bleed (16rem) off the left edge with its right edge still pinned to --welcome-w; inner content padding is comp...
Proxy injects X-Member-Id from session (me endpoint 400'd, so trial banner never had data)
Choreographed entrance — panel springs in after bg loads, then card fades
Wait for the first background image (onLoad, with a 3s safety fallback), then spring-bounce the welcome/recover panel in from off-screen left (physics spring, s...
Show trial banner on the welcome homepage (app/page.tsx) top-right, not just NavTop
Trial banner shows for any TEAM_MEMBER (system/team/admin), drop god dependency
Gate homepage trial banner to staff (team members/admins/system), hide from plain members
Trial banner signal is org-level (all members of a trialing org), not seat-based
Explicit Apply/Extend Trial buttons on platform Organizations tab (chips weren't discoverable)
Trial status chip + apply/extend-trial action on platform Organizations tab
Expose trialExpiresAt on platform org summary for the admin trials UI
Platform-admin apply/extend/status trial endpoints + DTO trialExpiresAt
Member gate grants unlimited catalog for active TRIAL + exposes trialExpiresAt
Comp provisioning clears trial deadline (comp supersedes trial)
In the existing-subscription update path of provisionCompSubscription, set trialExpiresAt to null so a previously trialling org is cleanly promoted to comp with...
Org-level gate grants full catalog for active TRIAL
resolveEntitlement now short-circuits for TRIAL subs whose trialExpiresAt is in the future (compute-on-read). Adds static isTrialActive() helper and 4 unit test...
Add TRIAL billing source + trialExpiresAt on AccountSubscription
Adds BillingSourceType.TRIAL, a precise LocalDateTime trialExpiresAt field on AccountSubscription (nullable, column trial_expires_at), and a repository finder *...
Retry boot-time rights sync on transient DB unavailability to avoid CrashLoopBackOff
**************** (steward exception queue)
Org-scoped-by-status finder backing the closing-steward exception queue (e.g. all BLOCKED_STEWARD packages for an org). Spring Data derived; no schema/KI.
CLOSING_RON_FALLBACK_APPLIED event key (doc 05 §6.1/§6.4)
The steward recovers a RON-walled/failed BLOCKED_STEWARD closing by satisfying the required RON slot with an alternative notarization (WET_SIGN/IPEN/PAPER_OUT);...
Pointer parallax (x+y) between welcome panel and background
Both layers drift with the pointer at different rates and opposite directions via framer springs. Background is scaled 1.12 and the welcome panel is oversized 1...
Persist background reorder via commit endpoint (no data loss)
Save now stages new uploads to incoming, then commits the full desired order (existing-by-srcIndex or new-by-token) so reordered existing images are re-slotted ...
Stop cross-org background image leak; order-safe reorder + staging bucket
Reordering only re-uploaded new files to their new index, dropping reordered existing images and leaving imageBgCount claiming unpopulated slots; provisioning t...
CLOSING_PACKAGE_CANCELLED event key (doc 05 §6.4 steward cancel)
The steward terminates a non-terminal closing **************** -> CANCELLED; the durable signal downstream stand-down / steward-queue close-out reacts to.
Move animated logo to bottom-right, centered above Powered-by pill
PoweredByKamo gains an optional logoSlot rendered centered directly above the pill within its fixed bottom-right anchor (other pages unaffected). The animated l...
Left-pinned translucent welcome panel + centered rounded form card
Welcome/Recover panel now full-height, flush to the left edge, on top of the background image with a translucent wash and square corners; hidden on mobile. Anim...
CLOSING_MERS_CONFIRMED + CLOSING_MERS_REJECTED event keys (doc 05 §6.3/§6.4)
The MERSCORP async callback flips a MersRegistration SUBMITTED->CONFIRMED/REJECTED; these are the durable signals **************** (confirmed) + the steward exc...
Return 404 for a missing org instead of 200 with empty body
getOrganizationById returned a bare null, which Spring serialized to HTTP 200 with an empty body; clients calling response.json() then threw 'Unexpected end of ...
Map missing org (404 or empty body) to a null payload
Pairs with the SecurityService change that now returns 404 for a missing org instead of 200-with-empty-body. Callers already null-check the org, so both the pro...
Let the System User resolve any org's applied model
The cross-org gate returned 403 when orgId != session org and the caller had no Member row in the target org. The platform-wide System User operates across ever...
Stop spurious errors flooding the console
- org/[id] proxy: backend returns 200 with an empty body for null orgs; response.json() threw 'Unexpected end of JSON input' -> spurious 500. Parse defensiv...
Resolve org tab title in generateMetadata to stop title flip
Static metadata.title rendered 'Kamo' server-side; Next re-asserted it after hydration, overriding DynamicMetaLoader's client update and flipping the tab back f...
Withhold rows until Myself member id resolves
ag-grid renders rowData beneath the loading overlay, so gating only the loading prop still flashed all leads while getMemberId() was 0. Blank the rows and stay ...
Default filter to Myself on load, hide market bar for single market, relocate toolbar
- Default agentFilter to __MYSELF__ at init + gate grid on userInfo load so it no longer flashes All Leads - Single market: auto-select it and hide the market-t...
§6.1 RON legal-wall grain — **************** (frozen WORM) + CLOSING_STEP_BLOCKED event
The property state is frozen identity on the closing package (a closing's property does not move) and is the grain the §6.1 RON state-eligibility legal wall rea...
URI-encode WOPISrc + trust all api.* WOPI hosts (multi-tenant)
Opening a doc for a non-kamocrm tenant failed with 'unauthorized WOPI host'. Docs's alias_groups only trusted api.kamocrm.com (the Docs-deployment env hardcoded...
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.
