Deep org-theming integration across every borrower surface
Executes the full plan from the org-theming analysis: every CTA, glow, progress bar, focus ring, ambient orb, chat surface, header logo, and attribution line no...
Make org branding loud — animated splash, ribbon, glow, footer
The subtle 1px accent ribbon and header logo weren't doing enough to celebrate the lender's brand. Now every hero surface delivers a real brand arrival moment. ...
Port org-scheme theming from kamo-internal so borrower surfaces pick up lender branding
Ports the subdomain-driven org-theme system from kamo-internal into kamo-los, scoped down to what makes sense for an unauthenticated borrower-facing surface (no...
Port public chat support from kamo-marketing, restyled for aurora theme
Brings the AI + live-support chat widget from kamo-marketing into the borrower-facing app, recoloured to the kamo-los aurora palette (surface-base / ink / auror...
Preserve aspect ratio on sky atmospherics so clouds + sun + birds don't stretch on portrait
CloudsLayer, BirdsLayer and the sun/star portion of SkyLayer were using preserveAspectRatio="none" so on a tall portrait phone the SVG coordinate system stretch...
feat(borrower-ux) backlog: blocked tasks, MUI date picker, memo widgets
1. Real blockedBy task semantics. Was: TaskHub knew about done/current/todo but the "locked" state was declared and never computed. Now: tasks declare blo...
feat(borrower-ux) sprint 4: a11y + post-submission + fee transparency + i18n keys
1. Accessibility: - StatusBanner gets role=status + aria-live, an inline icon (so success/warn isn't conveyed by colour alone), and a contrast bump ...
feat(borrower-ux) sprint 3: honest persona, intl identity, real consent, error taxonomy
1. Personality picker reframed honestly. Was "Pick your guide" — looked like the borrower was choosing their loan officer. Now reads "Choose a voice for o...
feat(borrower-ux) sprint 2: nav + autosave + intl address + resume recovery
1. BorrowerHeader: slim sticky header on every post-application surface (apply/*, waypoints/*, workspace/*). Logo / back-to-workspace on the left, page ti...
feat(borrower-ux) sprint 1: trust + safety baseline
Four highest-priority items from the borrower-UX audit: 1. Gate every stub integration behind **************** When the flag is off (e.g. real deployments),...
Mobile portrait tuning for hero illustration + chrome
On a portrait phone the 100x60 viewBox of every layer was being stretched into a tall narrow rectangle, which made the home and foreground look squashed and wei...
Illustration wrapper had no height — every layer rendered into a 0px strip
The JourneyIllustration root div was `relative overflow-hidden` with no explicit dimensions. Its parent was sized via absolute inset-0, but the relative child o...
Layered scene with parallax, ambient motion, real atmosphere
The first cut shipped a tiny static SVG behind an aggressive vignette, so EMPTY_LOT looked like a blank screen. Replace it with a real layered scene that actual...
Replace 3D world with 2D illustrated journey
Kill the procedural three.js scene end-to-end and rebuild the borrower's visual journey as a flat, accessible, mobile-friendly module that ships with full SSR s...
Infinite ground tiers + horizon depth + proper lawn signs
Ground — no more cube - SkyDome: 420 m back-side sphere coloured to the active TOD horizon, sits behind drei <Sky> so any seam at the camera corners is filled...
Sky no longer washes to white — golden-hour default + tuned sky shader
Sky was reading white because: - toneMappingExposure 1.05 + Bloom@0.45 with luminanceThreshold 0.72 was blowing the bright procedural sky into the bloom buffe...
Cinematic 3D pass — postprocessing, materials, geometry, motion, weather
The 7-day analysis from the chat, executed: Day 1 — Foundations: - @react-three/postprocessing added: EffectComposer with SMAA, N8AO (ambient occlusion), Blo...
node-config: raise k1m1 kubelet max-pods 110 -> 200
Default RKE2 max-pods=110 was being hit, blocking kamolos rolling-update deploys (maxSurge:1,maxUnavailable:0 needs slot to create new pod before killing old; d...
Real 3D environment + neighbourhood scenery + bolder home CTAs
3D scene was generic procedural boxes on a flat plane. Brought it up to a believable neighbourhood: - WorldScene: add drei <Environment preset="sunset"> for im...
3D cinematic journey + 10 personalities + persona homes
Major UI overhaul to lean into the existing 3D world rather than overlaying 2D chrome on top of it. - Rewrite Home with animated wall lerps, swinging front doo...
Clean up the session — bug fixes, dedupe, dead-code
Three-agent review surfaced real problems and copy-paste — addressing them: Bug fixes: - useEnsurePrimaryBorrower returned dead state (primaryUid, creating) an...
Retire the URLA wizard — waypoints now own the borrower journey end-to-end
Wires each connect-first waypoint to write through the existing /api/security/mortgage-apps/* endpoints, then redirects /apply/<section> to its matching /waypoi...
12 remaining waypoint sheets + 8 ceremony scene impls
Phase C foundation — every waypoint and ceremony slug in the spec now has a real, statically-prerendered surface. Stub adapters back the connect-first flows; UR...
M3a foundation — connections client, hooks, 2 hero waypoint sheets
Front-end half of the M3a connect-first foundation that the shared-lib Connection + VerifiedFact backend just landed. - lib/los/connections-client.ts — typed c...
MortgageConnectController — connections + verified-facts + reconcile endpoints
Exposes the connect-first capture surface at **************** - GET/POST /connections + POST /connections/{id}/complete - GET/POST /verified-facts + POST /verif...
Connection + VerifiedFact foundation for connect-first capture
Adds the M3a backend foundation for vendor connections and provenance-tracked verified facts. Stub-only end-to-end — real vendor SDK wiring (Plaid, Persona, ATT...
Frame the legacy URLA wizard inside JourneyShell
Phase A of the borrower-journey hand-off: the 3D world stays in view while the borrower works through every section. On wide viewports (≥xl) the world fills a s...
World becomes homepage — / serves the 3D scene, /start is the conversational porch, /journey paths flattened to /persona /waypoints/[id] /ceremonies/[id]
Borrower lands directly in the new experience on the public URL instead of the legacy conversational landing. Homepage CTA flips between 'Start your application...
Post-porch borrower lands in the 3D world (/journey/persona then /journey), not the legacy MUI wizard
Reward gate + auto-resume now route to /journey/persona?app=<uid>, persona pick lands in /journey?app=...&persona=..., and a persistent 'Continue your applicati...
LawnSigns r3f component + SignSheet + CompareMode + demo signs wired into SceneRoot
Programs-client + hooks (useProgramCatalog, useSetPersona, useSetSelectedProgram, useLiveProgramScores)
Add MortgageProgramController — list programs, set persona, set selected program
Bump for kamo-shared-library 1.5.0 snapshot refresh (M2 programs catalog)
Bump for kamo-shared-library 1.5.0 snapshot refresh (M2 programs catalog)
Bump for kamo-shared-library 1.5.0 snapshot refresh (M2 programs catalog)
Bump for kamo-shared-library 1.5.0 snapshot refresh (M2 programs catalog)
ProgramSeederRunner - seed 17 baseline LoanProgramCode programs (idempotent)
Repositories, DTOs, ProgramService (read-only catalog with naive overlay merge)
Add lenderModel column (additive; null = BROKER default at app layer)
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.