Send membership type from the /member and /team paths
/team signups create a TEAM_MEMBER (created PROSPECT, pending admin activation); /member signups create a MEMBER. RegisterFlow takes a memberType prop supplied ...
/team creates a TEAM_MEMBER (PROSPECT), /member creates a MEMBER
Public registration now honors the memberType the register site sends (from the /member vs /team path): /team creates a TEAM_MEMBER — as PROSPECT, so an admin m...
Expose team-member work phone extension in team-members-contractors
The /leads Agent filter needs the work-phone extension to label options as "Name (ext 8080)". The extension already exists on TeamMember (getPhoneWorkExtension)...
Request-support popup shows parent-org shared topics
Point the ticket-creation topic dropdown at the new /api/support/topics/available endpoint (own-org + parent-shared topics) so child-org users can contact their...
Surface parent-org shared topics in request-support popup
Child-org users could not see their parent org's shared support topics (assignToOwnOrg=false) when requesting support, because the popup only fetched own-org to...
New child orgs inherit their parent's securityProvider
When creating a child org from kamo-internal, set the new org's securityProvider to the parent org's securityProvider (the org it's created under) instead of le...
Show account-linked notice on ?linked=1
When register links an existing account to a new org, it redirects here with ?linked=1. Show "You already have a Kamo account — we've added this organization to...
Handle account-linked response for existing users
When the entered email already belongs to an ACTIVE account, the backend links this org to it and returns ACCOUNT_LINKED. Route those users straight to sign-in ...
Wire up member/team-member create + Prospect-gate UI
- Add the missing POST proxy routes /api/security/members/create and /create-team-member (these 405'd before, so creation never reached the backend). Status...
Reuse existing users, mirror to securityProvider, gate team-member sign-in
Reuse (no duplicate accounts for the same person): - MemberCreateController now reuses an existing user by personal email case-INSENSITIVELY (was case-sensiti...
SecurityProvider membership mirror + reuse/patch groundwork
- **************** userId): mirror a user into the org's securityProvider org as a base Member (deduped; no-op when the org secures itself or the user is al...
Wire Tasks tab to real backend + delete action + live count
Adds the Next proxy routes for /leads/{id}/tasks[/{taskId}] (the tab's getTasks/ addTask/updateTask/completeTask calls were 404ing), a deleteTask action in the ...
Lead tasks REST API + real-time TASK_CHANGED
Implements the backend the /leads/view Tasks tab was already calling but that never existed: GET/POST/PUT/DELETE **************** (LeadTaskController + LeadTask...
LeadTask entity for lead follow-up tasks
Backs the /leads/view Tasks tab (previously a frontend-only stub with no persistence). LeadTask (table LEAD_TASK) mirrors the frontend TaskItem shape **********...
Real-time datagrid + live lead view with per-pane edit locks
/leads grid is now fully live over websocket (NATS→STOMP): rows add/remove/update against the active filter automatically and changed cells blink once for other...
Org-guard the /topic/leads/rt/{orgId} realtime subscription
Cross-tenant SUBSCRIBE guard for the new lead real-time topic, mirroring the existing /topic/social/feed guard: a member may only subscribe to their own org's l...
Per-pane edit-lock REST API + auto-save sweeper
Adds /api/security/leads/{id}/locks **************** backed by LeadLockService: exclusive per-pane reservation, draft-buffering heartbeats that reset a 5-min id...
Real-time NATS publishing + per-pane edit-lock entity
Publish org-scoped lead events on security.leads.rt.{orgId} (created/updated/ deleted with changed-field keys, history-appended) so the /leads grid and /leads/v...
Integrate primary tabs into the header on remaining Style A pages
Follow-up to the Style A→B sweep, covering pages that don't route through SettingsView: - /kb: KbNavBar becomes a gradient hero header with the Articles/Resour...
Relocate bottom count bars into the header across social, imports tabs
Applies the vendors-tab treatment to the sibling CRM settings surfaces so the standalone "x • y" summary bar at the bottom no longer eats page real estate: - S...
Move vendor/product count above the header actions, bottom-align Refresh + Add Vendor
Recaptures the page real estate the standalone bottom summary bar used to occupy — the "x vendors • x products" line now stacks above the action buttons in the ...
Integrate primary tabs into the page header (Style B) across Style A pages
Every gradient-hero page that rendered its primary tabs in a separate card below the header now renders them inside the gradient header itself, matching /accoun...
Back arrow in header returns to /leads
Add an optional backHref/backTooltip to SettingsView that renders a white back arrow left of the title, and wire the CRM settings page to send the member back t...
Bold 'CRM Settings:' prefix, pipe separators, hover-only underline on tab links
Preface the CRM settings tab links with a bold 'CRM Settings:' label (new **************** key), separate links with ' | ' instead of a bare space, and switch t...
Add CRM settings tab links above refresh, gated like settings menu
Render a right-aligned row of white, underlined, space-separated links to each /settings/features/crm tab above the Leads header refresh button. The links reuse...
FindByStatus finder (freshness sweep enumerates ACCEPTED requirements)
Staff vendor-doc upload endpoint satisfies third-party requirements
POST **************** (LOS write): staff upload an appraisal/title/HOI/flood doc to the loan-level image store, then satisfy the loan's THIRD_PARTY requirement ...
Cascade condition waive/delete to document requirements
waiveCondition and deleteCondition now best-effort call MLOSDocService's suppress-for-condition after a successful waive/delete, so a waived condition's require...
Notify borrower when they've submitted all documents (DOC_COMPLETE)
DOC_COMPLETE canonical template (borrower has submitted every requested document)
Daily outstanding-document reminder sweep (re-nudge borrowers, throttled)
FindBorrowerOutstandingForNudge (stale outstanding requirements for the reminder sweep)
Notify borrower when a document is accepted (DOC_ACCEPTED, per-party routed)
DOC_ACCEPTED canonical template (borrower confirmation a submitted doc cleared)
Surface 'Needs review' (borrower-submitted docs awaiting staff) as a distinct, prioritized state
A borrower's uploaded document flips the requirement to RECEIVED (awaiting lender), but the Documents column only showed 'Awaiting borrower' or a neutral 'In re...
Centralize §4.5 supersession-collapse (RequirementSupersession)
The freshness engine leaves a STALE_EXPIRED predecessor beside its fresh successor under one **************** Only the read path (ConditionClearabilityComputer)...
Borrower notifications close the collection loop
DocNotificationService sends transactional emails (established EmailTemplateServiceClient path, recipient = account primary member, portal link from org root do...
DOC_REQUEST + DOC_REJECTED canonical templates
Borrower document-collection emails (transactional, CAN-SPAM-exempt): a request nudge when the checklist is minted, and a return-for-reupload notice. Added to C...
Document-collection progress column
Per-loan doc progress (accepted/total + a colored bar, 'N from borrower' / in-review / complete) in the applications pipeline, fetched in one batch by loanFileU...
Remember Quick Tips open/closed per USER across all pages
The help column's visibility was stored in a single global localStorage key, so it wasn't scoped to the user. Introduce useQuickTipsVisible, keyed by user id (n...
Proactive checklist generation + pipeline doc summary
- Generate the scenario document checklist at APPLICATION_TAKEN (MortgagePipelineController transition hook) so it exists the moment a loan enters the pipelin...
Standardize Quick Tips help column + de-slop reference page
- Rename the help side-column title to "Quick Tips" everywhere (SettingsView reads **************** whose value is now "Quick Tips"). - Add a shared HelpConte...
Nested sub-options so deeper items (e.g. Settings sub-topics) are reachable
The sub-option menu only rendered one level, so a sub-option that itself has sub-options (Settings topics → sub-topics) was inaccessible. - NavToolButton now r...
Member-configurable navigation — drag options between rail & top bar, expandable rail, per-member layout
Turn the two hardcoded navs (NavPri/NavTop) into a data-driven, per-member system. - Single nav registry (navRegistry) + pure resolver (resolveNavLayout) enfor...
**************** self-heal
Idempotent re-link of every borrower on a loan to its account-party, callable from the document surfaces so an upload can always resolve the borrower's vault pa...
Document vault tab — parties, requirements, satisfy/accept/reject
- AccountDocumentsTab: per-borrower-party view of the account's document vault and per-loan requirements. Upload once, satisfy every loan (satisfy-across); st...
Proxy the vault-backed requirement surface
- MlosDocClient: POST verbs (generate, satisfy, accept, reject, satisfy-across) + enriched loan/party reads over X-Internal-Auth. - MortgageAppController /{ui...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.