Changelog
What's new.
Every improvement to the platform, as it ships.
· kamo-internal
Drop Vendor Products column from Markets & Fields table
· kamo-internal
Market lifecycle + market-scoped vendors/products
- Markets & Fields: Active/Archived sub-tabs; row action is Archive/Reactivate (PATCH .../active), never delete - Vendors & Products: one sub-tab per active market; vendors are created under the current market's sub-tab; empty-state when the org has no active markets - Hide Vendors & Products / Manual Imports / Automated Imports tabs, /settings cards and nav slide-out links until the org has at least one active market (useHasActiveMarkets) - /leads only ever shows active markets
· SecurityService
Market status filter, archive/reactivate, market-scoped vendors
- GET **************** (default active); enrich each market DTO with vendor-products derived from its vendors - Replace DELETE /lead-markets/{id} with PATCH /lead-markets/{id}/active (archive/ reactivate) — markets are never hard-deleted - GET /lead-vendors?marketId= filter; vendor create forwards marketId
· kamo-shared-library
Scope vendors to a market; derive market products; archive markets
- LeadVendor gains a required MARKET_ID (columnDefinition pinned to plain UUID so the FK column does not inherit the referenced PK's gen_random_uuid() default) - Remove LeadMarket.vendorProducts M2M; a market's products are now derived from its vendors (LeadVendorProduct where vendor.market = market) - Vendor create takes a marketId and validates the market (org-owned + active); vendor title uniqueness is per-market - Markets are never deleted: replace soft-delete with setMarketActive (archive/ reactivate); add archived-markets query - DTOs: LeadVendorDTO.marketId; drop vendorProductIds from market request DTOs
· kamo-internal
Add media subdomain to the required records list
media.<domain> backs the realtime websockets (chat, calls, SMS, theme provisioning) and media streaming, but it was missing from the DNS setup catalog, so customers were never told to create the record — leaving media.<domain> as NXDOMAIN and the websockets failing to connect. Add it as a required record so the /setup/dns studio instructs the CNAME.
· kamo-internal
Show TRIAL pending (not-started) distinctly from expired on platform Organizations tab
· BillingService
TRIAL_PENDING mode for a not-yet-started trial
· SecurityService
Start trial clock on org owner's first login
Seed new orgs with a PENDING trial (source=TRIAL, trialExpiresAt=null) that grants nothing until started, then start the 3-day clock on the owner's first FQDN-scoped login so it never burns while DNS is still being configured. Owner-only, once (setting expiry clears pending); non-fatal so a trial hiccup never breaks login.
· kamo-internal
Trial chip on NavPri (white/red, tooltip=expiry) + homepage chip red; remove NavTop chip
· kamo-login
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 compensated so text stays put. The spring overshoot can no longer reveal the panel's left edge. - Card now fades in on a 450ms timer instead of waiting for the spring to fully settle, closing the dead gap between the bounce and the form appearing.
· kamo-login
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, stiffness 300 / damping 17). On bounce settle, fade+scale the form card into place. Mobile (panel hidden) and reduced-motion skip the bounce and fade the card directly. Entrance x is summed with the parallax x on one transform, so drift still works and never exposes an edge.
· kamo-internal
Trial status chip + apply/extend-trial action on platform Organizations tab
· BillingService
Expose trialExpiresAt on platform org summary for the admin trials UI
· BillingService
Platform-admin apply/extend/status trial endpoints + DTO trialExpiresAt
· BillingService
Scheduled sweep reverts expired trials to Free with cache-bust
· SecurityService
Auto-grant a 3-day trial to every newly created org
· SecurityService
Member gate grants unlimited catalog for active TRIAL + exposes trialExpiresAt
· kamo-internal
FeaturesManager unlocks full catalog on active trial
· kamo-internal
Trial status panel + apply/extend-trial action on subscription page
· kamo-internal
Homepage trial-mode banner with live countdown
· kamo-internal
TRIAL source, trialExpiresAt, platform trial API methods
· kamo-shared-library
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 tests covering active, expired, null-deadline, and non-TRIAL source cases.
· kamo-shared-library
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 **************** for the expiry sweep.
· kamo-shared-library
**************** (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.
· kamo-shared-library
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); the compliance/audit + pipeline-advance signal (carries the next pointer).
· kamo-login
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 16px on every side with its right edge pinned, so the drift never exposes an edge. Existing Ken Burns background animation is untouched and stacks underneath. Disabled under prefers-reduced-motion.
· kamo-shared-library
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.
· kamo-login
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 logo moves out of the top-left corner into that slot on the sign-in and recover pages; still hidden on mobile and during the phone-landscape rotate prompt.
· kamo-login
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. Animated logo now sits above the panel. Login/recovery form is a fully-rounded glass card centered in the remaining right-side space.
· kamo-shared-library
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 exception queue (rejected) react to.

Your universe is waiting.
Start free in minutes. Add products whenever you are ready — no migration, no new logins.
Free forever — no credit card required