The consent preview's checkbox is decorative, so hide it from screen readers without input props
The lender words its own text-message consent in Borrower Guide settings
A 'Text Message Consent Wording' field beside the guide's name and opening line, with help for a first-time admin and a preview of the checkbox exactly as a bor...
APR beside a locked rate, an explicit clear for "I'm Not Sure", the lender's consent wording, and team photos that load on any portal domain
- Workspace rate lock: when the loan officer recorded an APR on the pricing snapshot behind a loan-desk lock with the SAME rate, the posture carries it as a...
A gift saves as a true PATCH, the lender words its own text consent, and a borrower's full consent wording is kept
- AppMortgageService.patchGift merges the request over the stored gift, so saving one field no longer clears the amount, donor and recipient. - LenderProfile....
Saving the property's address keeps its purchase price, and saving a loan amount keeps the loan's purpose
**************** merge the request over the stored loan and property before the whole-record update.
The portal's job, account, debt, other-income and expense edits are true PATCHes
Each endpoint now merges the request over the stored row (shared library patch* methods), so changing a job's title no longer fails on the NOT NULL employment t...
Editing one field of a job, account, debt, other income or expense keeps the rest of the row
Those updates replaced every column, and EMPLOYMENT_TYPE_ID is NOT NULL, so the portal's one-field edits either failed or blanked the rest. **************** mer...
Sample values for the co-borrower request and its one-time code, so the admin preview renders them
Rebuilds EmailService onto the shared library that carries the MICRO_ACTION_REQUEST and MICRO_ACTION_CODE templates (an org seeds a missing template on first se...
Co-borrower requests and phone capture links, borrower saves as true PATCH, and document readings that say which page they came from
- MicroActionService + PortalMicroActionController (/portal/micro/{token}): a signed, single-use link. A request to the other borrower (confirm income, check ...
A micro action remembers the last document a phone capture uploaded
DDL (last_document_id UUID) applied by hand as the owner role before this push.
Borrower PATCH keeps what a screen did not send, declarations read and save under their URLA names, and single-use co-borrower requests
- BorrowerPatchMerge + **************** the request is laid over the stored borrower, so saving Your Info no longer wipes citizenship, dependents, housing or ...
Void Invoice, Email Receipt, and a retail order's Invoice tab
The work order's Invoice tab becomes RecordInvoice (app/components/invoices), generic over its record: the record (a work order or a retail order), whether it c...
Preview variables for the invoice and invoice receipt emails
commerce.invoice_sent and the new commerce.invoice_receipt (a paid work order or order invoice's receipt) get sample variables, so the template editor's preview...
Void Invoice, Email Receipt, and a retail order's Invoice tab
RecordInvoiceController is the Invoice tab's door for any record - list, Create Invoice, read, PDF, Record Payment, Void Invoice, delivery, send, link - with on...
Void records who, an order's invoices on an index, and the invoice receipt template
**************** (VOIDED_BY_MEMBER_ID) so a voided invoice shows who voided it; IX_INVOICE_ORDER and **************** for a retail order's Invoice tab; ********...
The application read names persona, selectedProgramCode, ownsNoRealEstate and realEstateOwnedCount
Pins the wire names the borrower portal reads, and rebuilds SecurityService onto the shared library that added them (a shared-library-only change deploys nothin...
The application shows its persona and chosen program, and a borrower can say they own no real estate
The application read now carries persona and selectedProgramCode (enum names, read-only). A borrower can answer URLA section 3 "I do not own any real estate" (o...
The saved-audience estimate takes the hook's null selection
useAudienceEstimates hands its fetcher null for nothing chosen yet, and AudienceCard and AudienceEditor pass audienceApi.estimate as that fetcher, which only to...
Record lead events for drips that start when someone enters a saved audience
AUDIENCE_ENTERED drips listen to lead created, status changed, reassigned and credit assigned, so an existing lead that comes to match the audience is noticed.
Audience filters on every trigger, account and loan triggers, enroll by filter
TriggerConfig gains leadFilter, accountFilter, loanFilter, loanStatuses, audienceId and includeExisting; a drip saved with the flat market/vendor/ product/state...
CapabilityCheck takes options whose capabilities may be absent
AccountFilterSection passes AudienceOptionsLike, where capabilities is optional, and the build failed type-checking on it. hasCapability already reads a missing...
Borrower consents are recorded as evidence, submit needs them, and each signer opens only their own link
A borrower now gives five consents in the portal, each its own versioned text per lender (default v1 seeded with its hash on first touch, a lender overrides wit...
The borrower's workspace knows their loan team, lock, rate watch and what happened
A new /mortgage-apps/{uid}/workspace surface for the MLOS borrower portal, gated like the application's own reads (staff who see the loan, or a party to it): - ...
A borrower's own "text me updates" tick records SMS consent on their lead
The borrower portal's save-my-spot form now offers an optional text-message consent checkbox. When the borrower ticks it and gives a phone number, the lead gets...
Talk It Through no longer 500s when the portal sends no flow
Set.of(...).contains(null) throws, so a request without a flow hint (the funnel before a purpose is chosen) answered 500. Found by a live probe after deploy. fl...
The ciphertext guard must keep seeing the borrower's ITIN and passport columns
The Borrower Guide preview draws the guide's face without a white ring on the dark portal
Who Qualifies on every trigger, saved-audience/account/loan triggers, and enroll by filter
- Every lead trigger narrows with the shared Audience Builder's lead section ("Who Qualifies"), saved as config.leadFilter; old drips' flat market/vendor/prod...
Drag the widget tiles in the home page drawing, not the list
The drag belongs on the "Your home page" grid at the top of My Widgets, so that is now where it lives. Widget tiles are dragged exactly like panes on the launch...
Email Invoice and the customer's link on the Invoice tab, and an account's invoices
The Invoice tab gets a Send to Customer card: Email Invoice (recipient prefilled from the account and editable, an optional note, and the email exactly as the c...
A Borrower Guide tab β the lender names and pictures the one guide on its borrower portal
Owner decision 2026-11-11: one guide per lender, in the lender's colours. The MORTGAGE market gets a Borrower Guide tab (?tab=borrower-guide): the guide's pictu...
Email a work order's invoice, and its customer link on the signer's invoice page
The public "view your invoice online" page already exists for subscription invoices: the signer app's sign.<org domain>/<locale>/i/<token>, branded, phone-ready...
The lender names its borrower guide, and the portal can Talk It Through (SI)
Owner decisions 2026-11-11 (KamoMLOS borrower-portal overhaul, stream S5). Borrower guide (one per lender): - BorrowerGuideService stores the guide's name, gre...
Keep a borrower's ITIN or passport, and add the consent scopes the portal records
A borrower without a Social Security number can now give an ITIN or a passport number, or choose to give it to their loan officer. Each number is encrypted at r...
The loan filter's Loan Purpose lists a loan's own purposes
A loan's purpose ids (the URLA list) differ from a lead's, so the loan section reads the options' loanFilePurposes rather than the lead list.
A work order invoice's customer links and sends, and an index for an account's subscription invoices
CommerceInvoiceLink (commerce_invoice_links): one view-online link per row, stored as the SHA-256 of a 256-bit token, never the invoice id; expires_at, revoked_...
A borrower can keep a rate watch on their loan, and a deal can have a closer
BorrowerRateWatch (mlos_borrower_rate_watch, created by hand as the owner role) holds a borrower's opt-in "tell me if rates drop" preference for one application...
Keep filter subqueries on their row-key indexes, and test them
EXPLAIN against the live catalog showed the planner driving callback, loan status and rate lock subqueries from their status indexes (every such row on the plat...
The lender profile names and pictures the borrower guide
Owner decision 2026-11-11: one guide per lender on the KamoMLOS portal, named and pictured by the lender. Three nullable columns on mlos_lender_profile β guide_...
One Audience Builder for leads, accounts and loans, and Saved Audiences
- Shared Audience Builder **************** lead, account and loan sections driven by AudienceOptions; a control shows only when the server lists its capabil...
The Notification Center lists every current kind
Adds Sales Floor, Remote monitoring, Request to share, Invoice, Confirm it was you, SI Assistant answer, the three Antivirus kinds, Contact request and decision...
Lead/account/loan audience filters, saved audiences and audience options
Extends LeadAudienceFilter with status/sub status (include or exclude), assignment, source, created/assigned/last-activity date rules, callback, birthday, loan ...
Drag and drop to reorder widgets on My Widgets
The widgets page is now split into On Your Home Page (in the order the launchpad draws it) and Not On Your Home Page. The first list is sortable: drag a card an...
Domain Setup can send as the domain itself, extends SPF instead of replacing it, and offers extra protection
- Add a domain: step 2 chooses between a separate sending name (recommended) and the domain itself. For the domain itself, the senders its SPF already lets ...
The preview is the whole page
Page picker and device widths are gone. Refresh, Ask for a Change and Open Full Screen take the status pill's place in the header on the Preview tab, and the we...
The bill pill turns red when due and shouts when overdue
DUE was a muted amber with a slow breath and read as a notice, not a bill. Both warning states are now red and differ in intensity: DUE breathes a glow and ping...
Send bulk mail from the domain itself, and extend SPF instead of replacing it
- A sending domain can now be the domain itself (acme.com), not only a name of its own (news.acme.com): create/lookup take root=true. Its records are SPF, D...
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.
