உள்ளடக்கத்திற்குச் செல்லவும்
KAMOUniverse

மாற்று பதிவேடு

என்ன புதிது.

அது கப்பல்கள் போல், தளத்தில் ஒவ்வொரு மேம்பாடு.

  1. · kamo-internal

    P1 frontend — charge-off queue + audit timeline

    - losApi: chargeOffQueue / confirmChargeOff / auditByLoan - **************** D120 review queue page; org user reviews each loan, adds a reason, clicks Confirm → POST /api/los/charge-off /{id}/confirm. Surfaces the LoanChargeOffService backend. - New <LoanAuditTimeline> component: reads **************** and renders the full LoanAuditEvent stream (actor type, kind, amount, timestamp). Designed to plug into the org-side loan detail page.

  2. · kamolos

    P1 batch — webhooks advance state, crons, commerce vertical

    Money movement (the core P1): - LoanPaymentPostingService: markSucceededAndPost / markFailed / markReturnedAndReverse / markDisbursementSucceeded / markDrawDisbursed. Allocation order locked: fees → interest → principal. Status auto-advances DELINQUENT ↔ ACTIVE ↔ PAID_OFF based on resulting balance. - StripeWebhookService is no longer log-only: payment_intent.succeeded / payment_failed / charge.refunded (ACH return) / dispute.created+closed / payout.paid+failed all advance the ledger via PostingService. - NachaReturnCode + RetryScheduler: NACHA-compliant R-code routing — R01/R09 retry up to 2× / 5 days apart, R07/R10/R29 revoke the mandate, exhausted retries flip LoanPaymentMethod → REQUIRES_REVERIFY. Commerce-vertical materialization: - **************** now creates Engagement (PERSONAL_LOANS, COMMITTED), Commitment (ACTIVE, with pricing+terms JSON snapshots), Order (AUTHORIZED, subtotal=principal), and threads their IDs back onto Loan.commitmentUid / engagementUid / originatingOrderUid in the same transaction. Cron jobs (real logic, not stubs): - CoolingOffAdvanceJob: enqueues a PENDING DISBURSEMENT_OUT payment for every PENDING_DISBURSEMENT loan whose cooling-off elapsed. - InterestAccrualJob: daily simple-interest accrual on principalBalance for ACTIVE + DELINQUENT loans. - StatementGenerationJob: installment per-due-date statement, LOC per-cycle statement with ADB approximation + annual fee assessment + auto-pay scheduling. - AutoDebitRunJob: fires PENDING auto-debits + DISBURSEMENT_OUT payouts + NACHA retries via StripeConnectService with idempotency keys. - ReconciliationJob: nightly re-sum of fees/principal/balance from the ledger; drift correction logged + audited. - ReminderDispatchJob: pulls SCHEDULED notifications past their scheduledFor and delivers via NotificationDispatchService. Notifications: - **************** real HTTP POST to EmailService (/api/email/transactional/send) and VOIPService (/api/voip/sms/send, /api/voip/voice/send), templateKey = "loan.{kind_lowercase}". Validation: - LoanProductValidationService: enforces APR ≤ state cap (per kind), prohibited-kind checks, min/max-principal sanity. Hooked into LoanProductService.create + update. Charge-off: - LoanChargeOffService.queue() lists D120 loans; .confirm() flips status to CHARGED_OFF and writes a CHARGE_OFF_RECORDED audit event. - LoanChargeOffController exposes **************** Audit browse: - LoanAuditEventController exposes ****************

  3. · kamo-internal

    P0 hardening — forms, session resolve, payment methods

    Forms (org-side): - **************** and /{productUid} edit pages - New LoanProductForm: basics / pricing / limits / terms / compliance sections, kind-aware fields (installment vs LOC), promissory-note template UID, allowed-state-codes - **************** product selection (only active products from this market), borrower-member, principal, optional term, borrower state, "save draft" vs "send" - /settings/features/lending: org-side Stripe Connect onboarding page (calls **************** redirects to Stripe) Borrower-side hardening: - New useCurrentSession() hook resolves memberId/orgId from /api/user-info (canonical *** path) — replaces fake KMEMBER/KORG cookie reads in My Loans, Offer Detail, Loan Detail, Lending Settings, PipelineLoanOffersTab, PipelineActiveLoansTab - New BorrowerPaymentMethodsCard: borrower can link ACH bank (Stripe payment_method id + mandate) or card, see linked methods, set default, revoke; embedded on /loans/[loanId] page - losApi: + startStripeConnectOnboarding Settings nav (2 of 3 places per memory rule): - SettingsStatusWindow adds "Loan Products" under Commerce + route entry for **************** - (sidebar.tsx has no POS entries — confirmed no-op)

  4. · kamolos

    P0 hardening — Stripe Connect endpoint + PDF flatten

    - Fix EsignClient imports: EsignGenericEnvelopeRepository / EsignSignatureRepository live in .esign.repos, not .esign root - New StripeConnectController POST **************** creates org Custom-account + returns onboarding URL (delegates to existing StripeConnectService) - MediaServiceClient.fetchBlob: pulls a stored blob's bytes for flatten/re-render workflows - New PdfFlattenService: appends an E-SIGN Act-compliant signature certification page to the source disclosure PDF for each captured signature (typed-name rendered in italic; signer/IP/UA/SHA-256 + envelope UID recorded on the page). Stores the new flattened blob via MediaService and returns blob id + SHA-256. - EsignClient.submitSignature now flattens after marking SIGNED and populates **************** + signedDocumentSha256. Flatten failure logs but does not roll back the signature itself.

  5. · kamo-internal

    /api/los/* proxy route → KamoLOS via k8s DNS

    Mirrors the /api/billing/[[...path]] BillingService proxy: - *** session resolved via Redis; X-Org-Id + X-Member-Id forwarded - /api/los/webhooks/* skip session auth (Stripe signature-verified at KamoLOS); Stripe-Signature header is passed through - God-mode header pass-through preserved - 502 wrapping on upstream failures

  6. · kamo-internal

    Add PERSONAL_LOANS commerce type front-end

    - engagementTypeLabels: extend EngagementType union + vocabulary - MarketCardGrid: PERSONAL_LOANS color (#14b8a6) + Landmark icon + counter - Market detail page: new tabs (Loan Products / Offers / Active Loans / State Rules) gated on commerceType === 'PERSONAL_LOANS' - losApi.ts: full DTO surface + thin fetch wrapper hitting /api/los/* for products, offers, loans, payments, draws, statements, payment methods, auto-pay, state rules, ESign signature submission - New MarketLoanProductsTab / MarketLoanOffersTab / MarketActiveLoansTab / MarketLoanStateRulesTab components - PipelineView: VERTICAL_ICONS entry for personal_loans - PipelineVerticalSection: PERSONAL_LOANS in hasSubTabs + render block routes Offers (intents) + Active Loans (commitments) sub-tabs - New PipelineLoanOffersTab / PipelineActiveLoansTab - Borrower (Member) /loans surface: index, /loans/offers/[offerId] with accept-and-sign flow (typed signature → ESign submission → accept-offer), /loans/[loanId] with balance, statements, payment history, Pay Now, draws-for-LOC - settings/page.tsx: commerce nav adds "Loan Products" entry

  7. · kamolos

    Initial personal-loan origination + servicing service

    New Spring Boot 3.1.5 / Java 21 microservice modeled on BillingService. Owns personal-loan domain end-to-end: - LoanProduct / LoanOffer / Loan CRUD with REST + DTO layer - LoanLifecycleService materializes Loan + commerce Engagement/Commitment on offer acceptance (one txn) - LoanPayment + LoanDraw + LoanStatement + LoanPaymentMethod + LoanRecurringPaymentPlan services + controllers - Math: AmortizationEngine (Reg Z Appendix J), InterestAccrualEngine (ACT_365 / ACT_360 + ADB), PaymentAllocator (fees→interest→principal) - StripeConnectService (Custom-account onboarding, ACH disbursement, ACH debit) + StripeWebhookService (idempotent via LoanStripeWebhookEvent) + connect-specific webhook endpoint - TilaRendererService renders Reg Z Schumer box (installment) / open-end disclosure (LOC) via PDFBox into MinIO - StateRuleSelfHealService boot-loads loan_state_rules.json (50-state registry + MLA cap + cooling-off) — reconcile pattern from rights - EsignClient + EsignSignController complete the missing member-facing signature submission path (writes EsignGenericEnvelope + EsignSignature in shared-lib) - NotificationDispatchService with dedup-keyed scheduling - Cron jobs: OfferExpiration, StatementGeneration, DelinquencySweep - k8s manifests (configmap / deployment / service), Dockerfile, Forgejo CI workflow (dual-cluster K1M1+K2M1) all aligned with BillingService conventions

  8. · kamo-shared-library

    Add PERSONAL_LOANS commerce type + entity package

    - CommerceType.PERSONAL_LOANS + parallel EngagementType + vocabulary - BuiltinVendorCategories entries for personal-loan vendors - 15 personal_loans JPA entities (LoanProduct, LoanStateRule, LoanOffer, LoanOfferDecision, Loan, LoanDraw, LoanPayment, LoanPaymentMethod, LoanRecurringPaymentPlan, LoanStatement, LoanFee, LoanDisclosure, LoanAuditEvent, LoanStripeWebhookEvent, LoanNotification) + 15 repos - 22 personal_loans enums (status, tier, kind, source, channel, etc.) - esign EsignGenericEnvelope + EsignSignature + repos for non-mortgage envelope creation and member-facing signature capture - KamoLOS → KamoMLOS comment-only refs updated across Organization / CommerceMarketService / CommerceService Schema management remains with KamoInitializerService; KamoLOS uses ddl-auto: none.

  9. · kamo-internal

    Photo-album uploads use the same WS pipeline as the Uploads tab

    Extracts the doc-manager upload pipeline (hashing → dedup check → register-or-upload → WebSocket-driven conversion) into a reusable useImagingUploads hook. The hook owns the per-file state machine, XHR progress, and the live conversion-progress WebSocket subscription that the Uploads tab uses. Photo-album dialog rewritten to consume the hook: - Files queue automatically and process one at a time. - Each in-flight file shows its current stage label (Hashing → Checking → Uploading → Converting → Complete) with a LinearProgress, a check / error / spinner icon, and a Retry button after failure. - The dialog now displays the actual server error message (e.g. "Failed to upload to MinIO") instead of swallowing it, and a Save is blocked while uploads are still in flight. - Successfully uploaded files automatically attach to the album as items.

  10. · kamolos

    Hide isActive=false programs from borrowers in real time

    useProgramCatalog now filters out programs with isActive=false before returning them to the loan wizard. The flag is computed server-side as (base.isActive AND override.isActive), so when a lender toggles a program off in the Mortgage Programs settings tab, the corresponding card stops appearing in the persona/program selection — capped by the existing 60s staleTime ceiling.

  11. · SecurityService

    Backfill program offerings for existing mortgage markets on boot

    DataLoader now calls **************** after the AppMortgage-engagement backfill. Sweeps every existing MORTGAGE CommerceMarket and ensures its program Offerings are provisioned. Covers markets that were created before the createMarket-side hook landed — specifically the ones the user added via Markets & Fields prior to this deploy. Idempotent: a fully-bootstrapped system logs "all markets already provisioned" and skips.

  12. · kamo-shared-library

    Bootstrap mortgage program offerings on market create + boot backfill

    When the user creates a CommerceMarket with commerceType=MORTGAGE — via the Markets & Fields settings tab — the market needs program Offerings under it for downstream commerce surfaces to point intents at. Previously this only happened lazily on the first AppMortgage create, so newly-added mortgage markets sat empty and KamoLOS-side admins saw no effect from adding one. - **************** when type=MORTGAGE, call **************** market) after save. Wrapped in try/catch so a program-seeding failure doesn't block market creation (KamoLOS reads programs from the Program registry, not Offerings). - **************** sweeps every existing MORTGAGE market and ensures its offerings are provisioned. Used by SecurityService DataLoader on boot to cover markets created before this hook landed. Idempotent — steady-state boots are a no-op.

  13. · kamo-internal

    Duplicate binders so users can fork without affecting the original

    Adds a "Duplicate" action accessible from the binder list's context menu and from a new button in the editor header. The duplicate starts from the source binder's metadata + items + modifiers, owned by the current user with no shares, and is automatically selected so the user lands on the new branch immediately. Wires up: - **************** proxy route - duplicateBinder() in binderApi.ts and useBinderStore - "Duplicate" menu item in BinderListPanel (works on any visible binder — owned, shared, or template) - Duplicate icon button + spinner in BinderEditor header

  14. · DocsService

    Add POST ****************

    Deep-copies a binder the requester can see (owned, shared, or template) into a fresh binder owned by the requester. Copies every item (DOC, SEPARATOR, GENERATED) with order, type, configJson, and per-instance modifier overrides intact; copies binder-wide modifiers; leaves the underlying Img documents alone (both binders reference the same docs). The copy starts with no shares and isTemplate=false.

  15. · kamo-internal

    Mortgage Programs toggle + MORTGAGE engagement deep-link

    - MortgageProgramsPanel now ships a real Switch on each program card with optimistic update + rollback on failure. Toggling a program calls PUT **************** and reflects the effective active state computed server-side from base + override. - **************** isActive) wraps the new endpoint. - /commerce/engagements/[id] page: APPLICATION linkType now routes to /applications/{linkId} (the URLA detail page), not the missing **************** MORTGAGE engagements auto-redirect into /applications/{linkId} on load so users land in URLA detail directly instead of the generic engagement view.

  16. · SecurityService

    PUT /programs/{code}/active + deprecate legacy mortgage POS endpoints

    - MortgageProgramController gains PUT **************** with body {"isActive": bool}, gated on LOS_TAKE_APPLICATION. Delegates to **************** which upserts the OrgProgramOverride row. - **************** getMortgageAppById, createMortgageApp, updateMortgageApp, updateMortgageAppStatus all marked @Deprecated with javadoc pointing callers at the URLA-fidelity /api/security/mortgage-apps endpoints. The legacy POS paths stay functional for back-compat.

  17. · kamo-shared-library

    Per-org enable/disable + deprecate legacy commerce-only mortgage path

    - **************** upserts an OrgProgramOverride row with recordState.isActive=desired; listForOrg now AND's the base program's active flag with the override's, so a disabled override carries the dual meaning "this org has explicitly disabled this program." - OrgProgramOverrideRepository adds findAllByOrganizationId and **************** for the upsert + listForOrg paths. - **************** / findMortgageAppById / **************** / updateMortgageApp / updateMortgageAppStatus are @Deprecated. They operate on commerce-only Intents tagged LOAN_APPLICATION and do NOT create or read URLA AppMortgage records — kept for back-compat with **************** but new code must use AppMortgageService + /api/security/mortgage-apps.

  18. · kamolos

    Scrubbable day↔night theme with sun-moon SkyToggle

    - Continuous t ∈ [0,1] scene position drives ~25 CSS custom properties on :root via linear RGB interpolation between warm-paper day and aurora night anchors in lib/scene/palettes.ts - Defaults to local time of day on first visit; manual override is sticky in a cookie, with a clock-icon button to re-enable auto follow - SSR ScenePainter bakes the resolved palette before first paint so there's no FOUC on returning visits; first-visit auto mode eases from day into local-clock t over ~1.4s - SkyToggle: pointer-draggable thumb whose sun-moon glyph rotates in real time with t and morphs between sun-with-rays and crescent moon - PageGlow + StarField ambient layers: amber sun-glow upper-left at day, cool moon-glow upper-right at night, ~80 seeded stars fade in past dusk and twinkle via reduced-motion-aware keyframe - MUI theme switches at t≥0.5 dusk boundary; CssBaseline body colour reads from CSS vars so interpolation stays continuous - Drops the hard-locked dark class + color-scheme; fixes two long-stale --surface-base (missing color- prefix) gradient fallbacks in JourneyCrest and CeremonyClient

  19. · kamolos

    Expose engagement/intent/commitment UIDs

    AppMortgageDTO now carries the commerce-lifecycle identifiers that the SecurityService backend populates on every mortgage application. KamoLOS doesn't actively use them yet, but typing them through means future borrower-facing affordances ("your application has been committed") can reference the commerce layer directly without going through the URLA model.

  20. · kamo-internal

    Show Commerce context + Programs settings tab

    - /applications hero now reads "Commerce > Residential Mortgages · URLA 2021" so staff see mortgage as one vertical of the commerce module, not a standalone pipeline. - New Mortgage Programs tab under Commerce settings — read-only catalog of loan programs (CONV/FHA/VA/...) with active state and ruleset version. Settings nav updated in all three locations (subTopics, routes, labelFor). - AppMortgageDTO/SummaryDTO + new ProgramDTO/LoanProgramCode types mirror the shared-lib changes (engagementUid / intentUid / commitmentUid). - mortgageAppsApi.listPrograms() hits the existing /programs endpoint.

  21. · SecurityService

    Enforce LOS rights + /commerce/engagements endpoint

    - MortgageAppController: every endpoint now gates on RoleRightType. Reads require LOS_VIEW_PIPELINE; creating a new application requires LOS_TAKE_APPLICATION; edits accept any LOS write role (take / process / underwrite / close / suspend); deleting requires LOS_SUSPEND_OR_WITHDRAW. KamoLOS's service account already carries the full LOS right set so the borrower journey is unaffected; staff users are gated per their role. - CommerceEngagementController: new GET **************** (list with type/status/date filters) and GET .../engagements/{uid} (detail), gated on ACCESS_COMMERCE. This is the vertical-agnostic counterpart to the mortgage-apps endpoint — same wire format whether you're reading a mortgage, a retail order, or a rental booking.

  22. · kamo-shared-library

    Wire URLA mortgage into Engagement/Intent/Commitment

    Mortgage is one vertical of the commerce system — alongside retail, rental, service, subscription, and procurement. This wires the URLA-fidelity mortgage stack to the domain-agnostic commerce lifecycle so cross-vertical surfaces (pipeline dashboards, analytics, customer portal) see mortgage like any other engagement. - Application: new engagement_id / intent_id / commitment_id FKs (nullable for legacy rows). - **************** bootstraps the org's MORTGAGE CommerceMarket + one Offering per LoanProgramCode on first app create; attaches Engagement+Intent to every AppMortgage; mirrors LoanFile.status onto Intent.status and Engagement.status; materialises a Commitment on FUNDED with the loan terms snapshot. Idempotent end-to-end. - AppMortgageService: createBlank/createFromLead attach to engagement; setSelectedProgramCode refreshes the Intent's offering. - LoanPipelineService.transition mirrors after each transition; commerce mirror failures don't block the URLA progression (log + continue). - AppMortgageDTO / AppMortgageSummaryDTO expose engagementUid / intentUid / commitmentUid for the frontend.

  23. · kamo-internal

    Add Organizer tab with binders, separators, generated docs

    Adds the Organizer to the doc manager: - New "Organizer" tab (position 4) with a binder list + editor split view; existing tabs shift right - "Add to Organizer" action on every doc row opens a binder picker (existing binders or create new) - Binder editor: drag-to-reorder items (HTML5 DnD), add Page Separator (color + label via ModernColorPicker), add Generated Doc (Cover Page, Table of Contents, Photo Album, Word Count) - Photo Album supports upload-new-photos (also adds to doc manager) and browse-existing - Binder-wide modifiers panel reusing the esign modifier shape (page numbers, label, watermark) - Per-doc-instance modifier overrides via a per-item dialog - Preview mode renders the merged PDF in an iframe - Download button invokes /api/docs/binders/{id}/render New Zustand store useBinderStore, REST client app/utils/binderApi.ts, and Next.js proxy routes under /api/docs/binders/* mirroring the existing imaging proxy pattern.

  24. · DocsService

    Add Organizer backend — CRUD, render, generated docs

    New REST surface under /api/docs/binders for the Organizer feature: - BinderController: CRUD, item add/update/remove/reorder, share, render - BinderService: org-scoped access checks, owner/share/template visibility, item position management - BinderRenderer: two-pass merge (deferred ToC/WordCount), applies per-instance and binder-wide modifiers via shared PdfBuildUtils - Generated-doc registry with renderers for Cover Page, Table of Contents, Word Count, Photo Album (uses MinIO for image bytes) Reuses **************** for esign-modified docs and **************** for access control.

  25. · kamo-shared-library

    Add Binder/BinderItem/BinderShare entities and repositories

    Adds the persistence layer for the new doc-manager Organizer feature: - Binder (Long id, owner member, org-scoped, isTemplate, binder-wide modifierJson) - BinderShare (UUID, recipient memberId, READ/WRITE role) - Spring Data JPA repositories with org-scoped queries and a "visible to member" union (owned + shared + template) Schema is picked up automatically by KamoInitializerService via Hibernate's ddl-auto.

  26. · kamolos

    Glimmer the test banner, fit the viewport, add cookie consent

    - TestModeBanner publishes its height to --kamolos-banner-h and globals.css subtracts it from min-h-screen so the home view no longer overflows the viewport by the banner's pixels. - Banner gains a sliding amber shimmer + slow shadow pulse so it reads as an active warning, mirroring the marketing preview bar. - New CookieConsentBanner (Accept All / Manage with analytics toggle), reskinned from the marketing version to use the dark aurora surface + per-tenant --org-primary / --org-gradient.

  27. · kamolos

    Surface SAFE Act NMLS IDs for lender + assigned LO

    Adds LoContactCard with avatar, presence pulse, verified NMLS link, and call/email/message actions in the top-left of hero and apply surfaces, so the borrower's licensed loan originator (name + NMLS ID) is always one tap away — required by SAFE Act §1503 and Reg Z §1026.36(g). The lender footer's NMLS is promoted to a "Licensed · NMLS #" trust pill, and useAssignedLO now returns a fake demo LO until loan-file LO assignment lands. LoGuideChip reverts to voice-only since the LO has its own surface.

  28. · kamolos

    Demo lender auto-loads when no real tenant resolves

    The reason "still not branded" — no real tenant org existed for the hostname being tested, so the SSR fetch returned null and every lender-facing surface fell through to the bundled Kamo defaults. The branding system was working; it just had nothing to brand WITH. Now ships a complete demo lender that auto-loads as the fallback when the real fetch returns nothing AND stubs are allowed **************** the default). Production with stubs disabled still falls through to bare Kamo defaults so we don't ever ship a real borrower to "Apex Mortgage". - lib/org/demoOrg.ts: "Apex Mortgage" — burgundy (#8B1538) primary and gold (#D4A24C) secondary, deliberately far from aurora so the branded effect is unmistakable. Full populate: tagline ("Three generations of getting you home."), NMLS #123456, support phone + email, year established 1989, both EHO + EHL marks, linear-135 gradient direction. New assetBasePath: '/demo-lender' on the org type tells ThemeLogo to load /demo-lender/logo-full.svg before trying MinIO or the global fallback. - **************** + logo.svg: real Apex Mortgage wordmark and mountain-peak mark in the burgundy → gold gradient. Not just a wordmark, an actual lockup. - lib/org/fetchOrganization.ts: returns DEMO_ORG when upstream is unreachable or no org is registered AND stubs allow it. Real-host / real-tenant resolution wins when present. - components/theme/ThemeLogo.tsx: consults useOrg().assetBasePath and puts that prefix at the front of the candidate chain. Demo lender's logo lands; real tenants' MinIO assets still resolve first when populated. - app/layout.tsx: <link rel="preload"> tracks the same priority order, so the SSR preload targets the demo lender's logo when demo mode is active. - **************** when org.id === 'demo-apex', the banner calls out "Showing the demo lender (no tenant org configured for this host)" so testers know which brand they're seeing is canned. Build 32/32, 140 tests pass. Reload the borrower app and you should now see the Apex Mortgage logo + name in the header, the burgundy and gold throughout the CTAs and ribbons, "Welcome to Apex Mortgage." on the landing hero, NMLS #123456 + EHO + EHL in the footer, "Call Apex Mortgage (800) 555-2739" in the help sheet.

  29. · kamolos

    Make the lender the primary brand, not an accent

    Reframes the borrower-facing app from "Kamo product with lender accents" to "lender's product, Kamo as the engine." Every surface now leads with the lender's identity. - LenderLockup **************** — canonical lender brand mark used everywhere. Scales sm → md → lg → xl → hero. Pairs the logo (or wordmark fallback in the lender's primary colour) with the lender's name; optional tagline below. Used by every surface that needs to feel "I'm at MY lender's site." - BorrowerHeader — header bar grows to h-14/h-16, logo + lender name always visible (size="md" forceWordmark), drop-shadow tinted in the lender's primary. The previous tiny 24px corner mark is gone. A new click-to-call phone button sits next to Help with the lender's primary border + glow; on mobile it collapses to an icon button. The accent ribbon is 4px (was 2px) and still pans the lender gradient. - Landing page hero — centred, dominated by the lender lockup at hero scale inside a glass card with strong --org-primary glow. Above the fold reads "Welcome to {LenderName}." (the gradient-clipped lender name is the headline), with the lender's tagline as the subtitle. A coloured pill says "{Lender} · Loan onboarding" instead of the generic "Kamoville". The CTA button is bigger and carries a strong --org-primary outer glow. - LenderFooter — full attribution row: lender name + NMLS Consumer Access link + phone + email + website + EHO/EHL mark. Copyright line reads "© 2023–2026 {LenderName}. All rights reserved." with a tiny "Onboarding by Kamo" credit. Visible across hero surfaces. - HeroBrandIntro — splash dwells 3.4s (was 2.4s), shows on first visit AND every 30-min idle return (was once-per-session). Logo card grows to size="hero" inside a stronger glass card with a heavier --org-primary outer glow. "Welcome to {LenderName}." is the headline; the lender's tagline is the subtitle. - generateMetadata — Next.js title template is now `%s · {LenderName}` with the default being just the lender name. Every child page reads lender-first in the browser tab and OG cards. siteName, title, and description all flow from the org record. Build 32/32, 140 tests pass. If your tenant config has populated tagline / nmlsId / phoneSupport / emailSupport / yearEst / colorPri / colorSec / logo asset, the site now looks unambiguously like your lender's product. With nothing populated it gracefully degrades to "Kamo" defaults.

  30. · InitializerService

    Migration for borrower-facing brand + disclosure columns

    Adds the seven nullable columns the kamo-shared-library Organization entity now declares (TAGLINE / NMLS_ID / PHONE_SUPPORT / EMAIL_SUPPORT / EQUAL_HOUSING_DISCLOSURE / ON_PRIMARY_TEXT / GRADIENT_DIRECTION) so the kamo-los borrower app can pick up lender branding without schema errors on existing orgs rows. @Order(35) — runs after LogoFullExtMigrationRunner (30) and before LeadCompanyColumnRunner (40). Idempotent via ADD COLUMN IF NOT EXISTS; safe to re-run. Per project policy this file is not executed here — KamoInitializerService is started by the user.

உங்கள் உலகம் காத்திருக்கிறது.

நிமிடங்களில் இலவசமாகத் தொடங்கவும். நீங்கள் தயாராக இருக்கும் போது பொருட்களை சேர்க்கவும் - எந்த மாற்றமும் இல்லை, புதிய உள்நுழைவுகள் இல்லை.

எப்பொழுதும் இலவசம் — கடன் அட்டை தேவையில்லை