Bulk-reassign selected leads to a team member
The grid already had multi-select checkboxes but nothing to do with a selection. Checking rows now reveals a Reassign action beside the other lead actions, gate...
Render member photos on avatars inside the chat window
The small avatar icons in a chat popup — the per-message sender avatar (MessageBubble) and the seen-receipt list (SeenIndicator) — all read SessionMember.avatar...
Show member avatars in chat tool window title bars
The tool-window title bar renders its icon from the window STORE props — ToolDock passes `avatarSrc={w.toolId === 'chat' ? w.props.avatarSrc : undefined}` and f...
Surface real upload errors, sync god mode to session
"Save failed: Full logo upload failed" discarded the status and body, so a 403 from the branding gate read identically to a MinIO outage. The server's own messa...
Author eligibility matrices from the catalog panel
Without a matrix covering a scenario's occupancy and purpose, pricing returns NO_COVERAGE — so before this, only a purchase of a primary residence could be pric...
Rebuild the agent studio as a full-width workspace
Removing the width cap was not the fix; the layout itself needed to be designed for the space rather than tolerated in it. The studio is now three zones side b...
Author lock policies — without one, no rate can be locked at all
RateCommitmentService refuses a lock whenever the priced result carries no lockPolicyVersionId ("lock-policy version is required"), and a result only carries on...
Stop the promote preview overcounting rows the server will reject
The "N approved row(s) will publish" caption counted a row whenever an APPROVED note_rate and base_price candidate existed for it, ignoring the values. A price ...
Use the full page width; make renaming an agent visible
Two things I got wrong. **Width.** The brief was explicit — use the full width of the page, do not waste real estate — and I capped the studio at a centred 880...
Stop the lead view crashing on a lead with no name
/leads/view/{id} died with "Cannot read properties of null (reading 'preferredName')". LeadDTO.toDTO() only builds primaryContact inside `if (lead.getName() != ...
Show how each agent is doing
Adds a performance section to the top of the agent studio: conversations, how often a person took over and what triggered it, outreach outcomes, and cost. Writ...
Retry an upload with the MIME type the server actually detected
The upload validates the multipart part's Content-Type against the type the server detects from the bytes, and that part type comes from the browser's File.type...
Edit what each model costs
Adds per-model price editing to the provider setup screen. Prices are seeded from each vendor's published list price where we know it, and blank where we do not...
Show the AI handoff context to the agent taking over
Renders an AI_HANDOFF system event as a card with the reason, the AI's summary, and a collapsible transcript of the conversation so far - so the borrower does n...
Required-text editor; dedupe AI general settings; fix model toggle
Adds an editor for org-wide required opening/closing text - the compiler and columns existed but nothing could set them, so the capability was dead. Copy states...
Full-page AI Sales Agent studio, replacing the modals
The agent editor was a ~800px MUI Dialog whose entire surface was a 10-row textarea, on the one AI tab that used a dialog at all. It is now a dedicated route, a...
Correct the CATALOG_SOURCE ordinal — every rate-sheet upload was rejected
ImageAssocType.CATALOG_SOURCE is id 14 but ordinal 12: the ids skip 6, so id is not ordinal+1 past SYSTEM_WIDE. The panel sent 13, which is out of range for a 1...
AI Sales Agents tab + per-channel agent assignment
Builds out /settings/ai?tab=sales-agents (was a stub): orgs create agents for their sales industry, either from a built-in template or by writing the training c...
Translate the steward console panels; drop the label escape hatch
Catalog, Identifiers, Ingestion, Loan Sale Desk and the Pipeline table rendered hardcoded English inside a console whose other screens were fully translated. Al...
Resolve the k1m1 npm registry host inside the build container
kamo-internal has not deployed since 2026-07-16: every build died in npm ci with ENOTFOUND k1m1 while fetching the private @kamo/* packages, which package-lock....
Use next-intl keys for the Mobile Devices strings
Swaps the literal labels added with the Devices sub-tabs for **************** and .mobileDevices.* keys, now published in the translation dictionary (CI fans th...
Fold Document QC into Documents & Conditions; PDF ingest notices
Document QC had its own steward screen for work that is the same documents, on the same loans, done by the same reviewer. Splitting it across two tabs made some...
Split Devices into "Phone System(s) Devices" + "Mobile Devices"
The Devices tab now has two sub-tabs. The existing PBX/softphone hardware table moves under "Phone System(s) Devices" unchanged; the new "Mobile Devices" tab M...
Ingestion panel accepts spreadsheets, not just CSV
The extractor now reads .xlsx/.xls and sniffs the format from the file itself, so the picker no longer restricts to CSV and the copy says plainly what is readab...
Steward Ingestion tab + the Catalog/Identifier proxy routes that were missing
Rate-sheet ingestion existed end-to-end in the backend and none of it was reachable. This adds the one surface that walks the whole chain: upload an investor's ...
Steward Identifiers tab — resolve an external number to its loan
New Identifiers tab in the mortgage steward console: paste an external number (loan number, MERS MIN, DU/LP/GUS case file, e-sign envelope...) and resolve it ba...
Filter non-ACTIVE members from live-participant pickers
Defense-in-depth behind the SecurityService gates: never render a non-ACTIVE team member as a selectable/live participant. Add teamMembershipStatus to the membe...
View third-party (loan) documents in the steward requirements review
A steward reviewing a THIRD_PARTY requirement (appraisal/title/flood) can now open the satisfying document. New binary Next.js route streams the per-loan authz'...
View/Download vault documents in the account docs tab
Turns the conditions/docs stage into a real review loop. The member-documents proxy route now passes through non-JSON (binary) upstream responses instead of tex...
Steward Catalog tab — seed a priceable bundle + inspect the catalog
New Catalog tab in the mortgage steward console: seed a tenant's first priceable bundle with REAL investor + product identities (unblocks pricing), and inspect ...
Loan-sale desk UI — the terminal capital-markets steward screen
LoanSaleDeskPanel in the Capital & Risk Command Center: list investor delivery commitments (status filter), open a commitment **************** and per-commitmen...
Per-loan lock recommendation on the lock desk
Surfaces the RCE lock-vs-wait recommendation (Lock / Lock-with-steward-override / Do-not-lock) with rationale + a 'model uncalibrated -> steward decides' note w...
EClose vendor categories on the integrations tab (RON/eNote/eVault/MERS)
Surfaces the four notarized-leg categories with their vendor options (Proof/ DocuSign Notary, DocMagic/Snapdocs, eOriginal/DocMagic, MERS eRegistry/DocMagic) so...
Steward audit/write surfaces — signed-doc download, delegation chips, vendor event timeline, AUS waiver/validation, non-QM stipulations, eligible-investor board, funding histogram, closing audit trail, catalog provenance, composer catalog
Residual-sweep UI: executed-PDF Download + delegation display + vendor-order event timeline; Offer-waiver/Record-validation actions on the AUS drawer; non-QM de...
Product picker for the non-QM run trigger
Replaces the plain productId input with a product selector populated from the org's active catalog (non-QM products first, NON-QM chip), falling back to the pla...
Disclosure void/sync/resend UI, workflow-template authoring, non-QM run, non-doc vendor orders, in-place config edit
Steward console UI for the remaining audited gaps: - #3/#8/#12/#17 DisclosuresSection: Void live native envelopes; 'Refresh status' hydrates per-recipient sta...
Consume @kamo/* shared libs, delete duplicated web copies
kamo-internal now imports the shared TS packages it originally seeded (one - avatarUrlTransform → re-exports @kamo/media-core (getAvatarSizedUrl, transformAva...
I18n the LabelManager software-identity labels via next-intl
Replace literal strings with **************** keys (added to the translation dictionary). English fallback covers locales pending translation.
Add install-QR (self-hosted APK) to Setup Mobile App tab
Install/Sign-in toggle: "Install" shows a QR to the signed release APK on the new phone can download+sideload it; "Sign in" keeps the password-gated OTK flow.
Web Chat Integration design customizer + live preview
Adds a Customize dialog to the Web Chat Integration tab: an editor form (colors, copy, layout, behavior, AI prompt) on the left and an instant, non-interactive ...
Web Chat Integration tab — list, create, snippet (BFF + UI)
Phase 2 core of the Web Chat Integration settings tab: BFF routes proxying to the Phase-1a MediaService CRUD, a typed client, and the /settings/features/chat ta...
LabelManager software identity UI + internal tab title
- Company Info: software name/short-name + login/register name + tab-title selectors - Branding: software full/simple logo uploads, override toggles, and per-su...
3-stage org onboarding guidance (create → finish DNS → enter)
Generalize the first-org hero into a single stage-aware guidance panel keyed on the member's owned-org count + DNS status (from /api/security/org/my-networks): ...
Dual company/software resolver + delivery + consumption
- Organization.ts: deliver software identity + per-surface selectors via OrgContext - brand.ts: **************** (+ vitest, 8 cases) - ThemeLogo: logoSoftware/l...
First-org CTA hero for members on the platform org
Show an onboarding hero at the top of the home launchpad inviting a KamoCRM-platform member (not a team member) who hasn't yet created a child org to spin up th...
Tightly-cropped Copilot icon + bare NavPri entry
Added a trimmed icon.png (glyph fills ~82% of the frame) and pointed the home pill, NavPri entry, Interaction Center tab, and QR center at it. Stripped the NavP...
Add "Access Copilot Mobile App" entry points on home + NavPri
Both surfaces dispatch an `open-interaction-center` event that NavTop listens for to open the Interaction Center on the Setup Mobile App tab. Home shows a label...
Rename tab to Setup Mobile App; even full-height spacing; logo centered on title with description beneath
Password-gate the QR, single-line tab, logo-left header, 10-min code
- Member must re-enter their password (server-verified via /api/mobile-access-otk, which mints the OTK only on success) before the QR is revealed — prevents s...
Setup Mobile Access tab — QR to install + auto-configure Mobile Copilot
New 3rd tab in NavTopPanel (gated by ALLOW_MOBILE_ACCESS right): shows a branded QR encoding a short-lived OTK deep link (kamocopilot://configure) that signs th...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.