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....
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 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...
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...
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...
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...
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...
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...
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 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...
Mirror MANAGE_MARKETING_SITE (708)
A standalone root under General Permissions, so security models can grant Manage Marketing Site to someone other than the owner.
Org marketing websites β member, platform, edge and webhook APIs
- **************** site, preview pass, change requests (+ pictures), cancel, source.zip (Forgejo archive streamed, audited), get-a-website lead, connect-www (...
SecurityService may consume BILLING_EVENTS (marketing sites follow billing.subscription.*)
PlanDto.flatPrice for a flat plan's per-month label
A flat product (CorePlans.isFlat, e.g. Marketing Website $50/month) now carries its flat monthly charge so the console labels it "per month", not "per seat".
Apply marketing/ from deploy-services like every other folder
A "Deploy Marketing Sites namespace" step runs marketing/apply.sh (namespace kamomarketing, marketing-ci and site-edge RBAC, Middlewares, secrets created-if-mis...
POS grace periods, My Bill core plan + every subscription, bank payments
- GET/PUT **************** (seller's MANAGE_SUBSCRIPTIONS): opt-in grace period, OFF by default; the hourly billing job stops service when a deadline passes...
Seed the Marketing Websites market and plan; attach agreements to their market
Market **************** (display order 14, after KamoCRM), plan MARKETING_WEBSITE: $50/mo flat, one seat, $4,950 FLAT setup, no trial, not public, no app bindin...
Core-plan pickers, flat plans, grace periods, bank payments, paid/ended events
- Mailbox/PBX controllers and reconcilers, LicenseUsageService, OrgPlanService: the CORE subscription via CorePlans (never a flat product's Stripe sub); flat ...
A second subscription is safe, grace periods, per-market agreements, paid/ended events
Generic for every org selling through the Subscription line of business: - CorePlans: the core-plan subscription is picked deterministically; a flat product (...
Manage Marketing Site, the Marketing Websites platform console, and grace-period billing controls
Members (the owner, or a holder of MANAGE_MARKETING_SITE): - NavExtra "Manage Marketing Site" beside EZ Setup; an owner without a site sees "Get a Website". - /...
God-only support topics, the website request ticket and its conversation hook
- Tickets under a god-only topic (SupportTopic.godOnly) are excluded from every support list, count, badge, metric, auto-open and claimable queue unless the v...
Record the Org Marketing Websites schema and seed its topic and first site
MarketingSitesMigration (@Order(0), idempotent): the WEB-<n> sequence, the NONCONCURRENT indexes and support_topic.god_only exactly as hand-applied 2026-11-10; ...
A prepared hand-off can start in a marketing site's checkout, with a WEB-<n> folder
~/Kamo/Marketing/<repo> on first use, through sage's own credential store), cwd (absolute, bounded to the home after resolving links) and workPrefix (BUG defaul...
Relay the marketing-site Forgejo push webhook to SecurityService
Sessionless, raw body and every Forgejo/Gitea signature and event header preserved; SecurityService verifies the HMAC against MARKETING_WEBHOOK_SECRET.
Marketing site, request and dispatch entities, rights and the god-only support topic flag
- MarketingSite / MarketingSiteRequest (WEB-<n> from its own sequence) / MarketingSiteDispatch entities and repositories, matching the hand DDL (column defaul...
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.
