Rebuild the mortgage application as a real, white-labelled form

Featurekamo-apps
Shipped
September 5, 2026 at 6:20 PM UTC
Author
Kamo
Commit
0b63128

The page this replaces was a prototype wearing a production URL. It posted to `http://localhost:8082`, so no application it ever collected reached anything. It named "Mark Johnson with American Lending Group, NMLS 343298954" as every visitor's loan officer. Its footer claimed a California Residential Mortgage Lending Act licence, an office at "123 Mortgage Lane", and a complaints line reading "1-800-XXX-XXXX" — under whichever tenant's logo happened to load. The consent text asked borrowers to agree to terms from "[Broker Name]". **Addressed by product, not by host.** `/loan/mortgage/{productId}`, with an optional `/{memberId}` for a loan officer's referral link. The product id names the organization, so the page works identically on a lender's own `apps.theirdomain.com` and on `apps.kamocrm.com` — same logo, colours, favicon, backgrounds and disclosures either way. That is what makes white-labelling possible for a lender who has not configured DNS, and it is why nothing here resolves a tenant from the hostname: a proxy to the shared API host loses `X-Forwarded-Host`, and every such lender would have resolved to the platform. A product whose market is not a mortgage market answers 404, identically to a deleted one, and the page says the application does not exist. **The footer is now the organization's own record** — legal name, NMLS with a Consumer Access link, real address and contact, the state licences it entered, its fair-housing mark, and its published policy links. A value the lender has not entered renders nothing at all. An empty footer is a gap somebody can fill; the previous one was a false regulatory statement nobody could detect. **Design.** Two columns: a fixed brand-coloured spine carrying the mark, the officer and a continuous progress rail, against paper. The spine is the whole idea — it answers "who am I giving this to" and "how much more is there" permanently, which are the two anxieties of this form. Fraunces for the statements, Inter Tight for the work, both self-hosted so neither the image build nor a borrower's first paint depends on Google. Tabular figures everywhere a number is typed. One orchestrated moment on load; after that, motion only answers an action, and `MotionConfig reducedMotion="user"` makes that a real preference rather than one framer ignores. **Submission** goes to SecurityService's public endpoint, fail-closed on an Capcha ***, and lands on a confirmation page that is a real route — it survives a refresh and a forwarded link. The receipt email is sent server-side from the same disclosure profile the footer uses, so the two cannot drift. Verified in a headless browser at 1440 and 390: five steps, validation, error states, the confirmation, the not-found page, and axe clean (WCAG 2.1 AA) on all four — one real contrast failure found and fixed in the rail.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing