← All work

Ennkar Connect

A Finance-category reverse-mortgage app, live on iOS and Android.

ExpoReact NativeTypeScriptNativeWindZustandSupabaseEdge Functions (Deno)EASTwilio VerifyResend
Role
Lead engineer
Period
Apr 2026 – Present
Status
Live · v1.0.3
Stack
Expo, React Native, Supabase Edge Functions.
Ennkar Connect reverse-mortgage calculator screen on iOS

The problem

Ennkar needed a way for homeowners to explore a reverse-mortgage estimate and start an application from a phone — and the moment that calculator produces a number, it is a regulated financial quote, not a marketing widget. Getting a HECM or jumbo estimate wrong, or letting it drift from what the web platform and loan officers see, is not a cosmetic bug.

Constraints

  • The app is in the App Store's Finance category, which brings mandatory account-deletion support and financial-feature disclosures in review.
  • A phone is not a trusted execution environment — any pricing math computed on-device is one decompiled build away from being manipulated.
  • The mobile app, the web platform, and Pulse CRM all need to agree on the same loan math without three separate implementations drifting apart.
  • Lead consent has to satisfy TCPA-style requirements at the point of submission, not after the fact.

What I built

An Expo Router app on React Native 0.85, with Bun deliberately isolated as its own package-manager 'island' inside the Ennkar Platform pnpm workspace, to protect Metro and native tooling from workspace-wide dependency changes. The calculator debounces user input and calls a shared Supabase Edge Function for every price — the same server-authoritative pattern Pulse CRM uses for its engine.

  • Dual-product evaluation across HECM and proprietary/jumbo programs, winner-aware capacity, household-age basis, and cash-to-close-required outcomes.
  • A FRED interest-rate sweep against 5,330 seeded HUD PLF factor rows, with formula versioning and audit trails.
  • TCPA-style consented lead submission and Twilio Verify SMS one-time-passcode verification.
  • In-app account deletion and App Store / Play Data Safety and financial-feature declarations, required for Finance-category approval.
  • Role governance: professional role grants (loan officer, financial advisor) go through a super-admin web queue, with Resend email and Expo push notifications on decision — no self-elevation path.

Architecture

The app never computes a final number. A debounced preview call goes to a shared pricing Edge Function that owns the math — the same function boundary the web platform calls — so the calculator, the web funnel, and internal review always see the same price for the same inputs. Release engineering runs through EAS Build, Submit, and Update across dev, staging, and production channels, with Associated Domains and Password AutoFill configured for the auth flow.

Ennkar Platform architectureEnnkar Connect (Expo mobile) and ennkar.com (Next.js web) both call one server-authoritative pricing Edge Function over Supabase Postgres with Row-Level Security. Content lives in a separate Payload-on-Neon database with no PII. Scheduled Postgres jobs sweep FRED for interest rates; Twilio Verify and Resend handle SMS and email at the edges.rate sweepSMS OTPemailEnnkar ConnectExpo · React Nativeennkar.comNext.js 16Pricing Edge FunctionDeno · server-authoritativeSupabase PostgresRLS on every public tablePayload CMSContent on Neon — no PIIpg_cron pipelinesRate sweeps, remindersFREDInterest ratesTwilio VerifySMS OTPResendEmail
Mobile and web both call one server-authoritative pricing Edge Function over Supabase Postgres.

Decisions and tradeoffs

Decision

Never compute a final loan number on-device — every price comes from a server call.

Because

A regulated financial quote cannot depend on client-side logic that a user's device could tamper with.

Trade-off

Every price change requires a network round trip, so the UI has to debounce and show a loading state well, rather than updating instantly on every keystroke.

Decision

Isolate the mobile app on Bun inside an otherwise pnpm workspace.

Because

Metro and Expo's native tooling had version-sensitive dependency requirements that workspace-wide pnpm hoisting kept breaking.

Trade-off

The monorepo now has two package managers to reason about, documented explicitly in AGENTS.md as the 'Bun island' so it doesn't get quietly undone.

Outcome

Status
Live on iOS and Android
Current version
1.0.3
App Store category
Finance
First release
2026-05-22
PLF factor rows seeded
5,330
Commits
340 / 346

As of 2026-08-24

This is the single most externally verifiable claim in the portfolio: anyone can open the App Store or Google Play right now and see a shipped Finance-category app published by Ennkar, Inc.

Want the full picture, or open to talking about your own project?