eKYC 3.0 — Old vs New UI: Functional Comparison Report
Old: EkycDevProject (Flutter BLoC/Cubit, 17 features) • New: flutter_app (Flutter setState, 16 stages)
Generated: 9 April 2026 • Includes BRD change analysis (EKYC3_BRD_v1, Bank_Auto_Verify_BRD_v2, Annual Income Relocation BRD)
9
Functionally Equivalent
4
Significant Differences
3
Features Removed/Merged
SAME Functionally equivalent
CHANGED Functional difference
NEW Added in new code
REMOVED Not in new code
IMPROVED Enhanced in new code
BRD Changed per BRD requirement
| Feature | Old App (EkycDevProject) | New App (flutter_app) | Status |
| Purpose |
No dedicated arrival stage. Session starts at Registration/OTP. |
Dedicated splash with session creation, device info capture, fraud pre-checks, journey resume. |
NEW |
| Resume Logic |
Resume handled via pageName param passed from parent app. Uses ScreenNavigator to jump to saved page. |
Calls getResumeState(leadId) + getJourneyStatus() to auto-detect stage. Maps resume pages to routes. |
IMPROVED |
| Session Init |
No explicit session creation. Relies on initSuperApp later. |
Calls journeyInit(deviceType) to create session with UTM params. |
NEW |
| Loading Animation |
N/A |
Lottie RISE logo + Lottie loader animation. No-connection Lottie on error. |
NEW |
| Error Handling |
N/A |
Error state with retry button. Shows error message. |
NEW |
Stage 0 is entirely new in the rewrite. The old app had no arrival screen - users went straight to registration. The new app adds session management, device fingerprinting, IP velocity checks (backend), and intelligent journey resumption.
| Feature | Old App | New App | Status |
| User Inputs |
Mobile, Name, Terms, Referral Code (optional), DIY ID (optional), Location (lat/lng) |
Mobile, Name, Terms only |
CHANGED |
| Mobile Validation |
10 digits, regex ^\d{10} |
10 digits, regex ^[6-9]\d{9}$ (stricter - must start with 6-9) |
IMPROVED |
| Name Validation |
2+ chars, letters + spaces, no double spaces, no leading/trailing spaces |
2+ chars (simpler validation) |
CHANGED |
| API Calls |
app/signup app/sendOtp lead/bindDiyDataFromId app/validateReferralCode |
registrationSignup (single consolidated call) |
IMPROVED |
| Referral Code |
Optional input field + validateReferralCode API |
Not in UI (moved to session init via UTM params) |
CHANGED |
| DIY Partner Bind |
Binds DIY ID via bindDiyDataFromId |
Not in UI (handled at backend session level) |
CHANGED |
| Location Capture |
Geolocator permission + lat/lng sent with signup |
Not captured at registration (moved to Stage 0 journeyInit) |
CHANGED |
| Existing User |
Shows appropriate message for existing customers |
Detects via error codes (BE_REG_MOBILE_EXISTS, etc.), auto-resumes journey |
IMPROVED |
| Hero Illustration |
SVG illustration (ic_register_illustration.svg) |
Same SVG illustration (migrated) |
SAME |
| SDKs Used |
Geolocator AppsFlyer |
url_launcher (for T&Cs only) |
CHANGED |
New app simplifies registration by moving referral, DIY, and location to backend/session level. Fewer API calls = faster registration.
| Feature | Old App | New App | Status |
| OTP Input |
PinPut widget (4 digits) |
Custom 4-box input with auto-focus, auto-submit on 4th digit |
SAME |
| Resend Timer |
60 seconds countdown |
30 seconds countdown (configurable via ApiConfig.otpResendCooldown) |
CHANGED |
| Max Attempts |
Not explicitly limited in UI (backend handles) |
5 attempts max, shows locked banner with remaining count |
IMPROVED |
| API Calls |
app/verifyOtp app/sendOtp app/initUserResponse auth/sendEmailOtp |
verifyMobileOtp resendMobileOtp |
IMPROVED |
| KRA eSign Pending |
Not handled at OTP stage |
If kraEsignPending=true in response, skips to Stage 13 (eSign directly) |
NEW BRD |
| Resume from OTP |
Uses initUserResponse pageName to determine next screen |
Uses resumePage field from verifyOtp response |
IMPROVED |
| Edit Mobile |
Edit icon to change mobile number |
"Edit" button navigates back to Stage 1 |
SAME |
| Success Animation |
Lottie tick animation |
Green "OTP Verified!" text for 1.2s before navigation |
CHANGED |
| Feature | Old App | New App | Status |
| Verification Methods |
Manual email + OTP, Google Sign-In |
Google Sign-In, KRA Prefill, Manual email + OTP (3 methods) |
IMPROVED |
| KRA Prefill |
Not present |
If KRA data has email, shows as prefilled option with verified badge |
NEW BRD |
| Auto-Verification |
Google OAuth skips OTP |
Google OAuth and KRA prefill both auto-verify (skip OTP entirely) |
IMPROVED |
| UI State Machine |
Simple flow (enter email → enter OTP) |
4-state machine: initial → manualEntry → otpEntry → verified |
IMPROVED |
| API Calls |
auth/sendEmailOtp auth/verifyEmailOtp auth/verifyEmailWithGoogle |
getEmailDetails generateEmailOtp verifyEmailOtp resendEmailOtp |
CHANGED |
| Email Source Tracking |
Not tracked |
Tracks source: GOOGLE, KRA, or MANUAL |
NEW |
| Feature | Old App | New App | Status |
| PAN Input Paths |
Manual entry: PAN + Name + DOB. DigiLocker integration for Aadhaar (mixed in same screen). |
Two clean paths: Prefilled PAN (from KRA/DigiLocker) OR Manual entry. Separated from DigiLocker. |
IMPROVED |
| PAN Validation |
Regex ^[A-Z]{5}[0-9]{4}[A-Z]{1}$ |
Same regex ^[A-Z]{5}[0-9]{4}[A-Z]$ |
SAME |
| KRA Status Check |
Not explicitly checked at PAN stage |
confirmPan() returns kraStatus. If VALIDATED, skip DigiLocker (Stage 5). |
NEW BRD |
| Prefilled PAN |
Fetches via getUserPanDetails |
getPanDetails() returns preFetched flag + masked PAN + name |
IMPROVED |
| Attempt Limit |
Not explicitly limited in UI |
Max 3 PAN validation attempts with counter display |
NEW |
| API Calls |
pan/verifyPanNSDL proof/updateStage pan/getUserPanDetails pan/validatePan + 4 DigiLocker endpoints |
getPanDetails validatePan confirmPan |
IMPROVED |
| DigiLocker in PAN |
DigiLocker initiation/callback handled within PAN cubit (mixed concern) |
DigiLocker is a separate Stage 5. PAN stage focuses only on PAN. |
IMPROVED |
| Feature | Old App | New App | Status |
| DigiLocker Providers |
Dual: AINxt DigiLocker (primary) + DigiLocker (backup). Both always initialized. |
Single WebView-based DigiLocker. Backend determines provider. |
IMPROVED |
| KRA Customer Skip |
Not handled (all users go through Aadhaar) |
If isKraCustomer=true, auto-skips to Stage 6 (Bank) |
NEW BRD |
| Upload Fallback |
Not available (DigiLocker mandatory) |
If DigiLocker unavailable, shows file upload fallback (JPG/PNG/PDF, max 5MB) |
NEW |
| Consent |
Implicit (starts DigiLocker flow directly) |
Explicit consent checkbox required before DigiLocker WebView |
IMPROVED |
| Success Flow |
Navigate immediately after callback |
Shows success screen with 5-second countdown, then auto-navigates to Bank |
CHANGED |
| SDKs |
AINxt DigiLocker (native) DigiLocker (native) |
webview_flutter file_picker |
CHANGED |
New app uses WebView instead of native SDK for DigiLocker - better web compatibility and easier maintenance. Upload fallback is a significant usability improvement.
| Feature | Old App | New App | Status |
| Verification Methods |
Manual entry (Account + IFSC) + Penny Drop (2-step: get token → SMS → confirm) |
UPI Reverse Penny Drop (primary, 5 app options) + Manual entry (fallback) |
CHANGED BRD |
| UPI Apps |
Not supported as primary method |
PhonePe, Google Pay, Paytm UPI, Cred UPI, Other Apps |
NEW |
| Annual Income |
Collected in Other Details (Stage 9) |
Collected right after bank verification (5 income ranges) |
CHANGED BRD |
| Bank Auto-Verify |
Manual penny drop with SMS confirmation |
Auto-verify via UPI reverse penny drop + auto movement to next stage |
NEW BRD |
| IFSC Lookup |
bank/getBankListByIFSC |
getBankByIfsc on focus-loss (auto-fill bank/branch name) |
SAME |
| Bank Rejection |
Shows rejection reason + bank proof upload screen |
Max 3 attempts with counter. No separate bank proof upload screen. |
CHANGED |
| OneMoney |
OneMoney for pre-linked bank details |
Not used (Decentro auto-verify per BRD) |
CHANGED BRD |
| UI States |
Single form view |
3-state UI: upi (app selection) → manual (form) → verified (confirmed + income) |
IMPROVED |
BRD Changes: Bank_Auto_Verify_BRD_v2 specifies Decentro-based auto-verification replacing manual penny drop. Annual Income Relocation BRD moves income collection from Stage 9 to Stage 6.
| Feature | Old App | New App | Status |
| Liveness SDK |
HyperKYC v2.6.0 + HyperSnap v7.2.0 + AINxt (backup) |
image_picker (camera/gallery) + backend liveness check |
CHANGED |
| API Calls |
8 endpoints: getPhotoDetails, getProofDetails, createHyperVergeRequest, getHyperVergeResponse, getLivePhotoLocationDetails, ainxt x2, submitOCR, updateStage |
initiateLiveness livenessCallback |
IMPROVED |
| Location Capture |
Geolocator captures lat/lng at selfie time |
Geolocator captures GPS coordinates with photo |
SAME |
| OCR Extraction |
Client-side submitOCRProofUpload |
Server-side (backend handles OCR after photo upload) |
IMPROVED |
| Attempt Limit |
Backend-controlled |
Max 3 attempts with UI counter |
IMPROVED |
| Photo Preview |
HyperSnap handles preview internally |
Shows captured photo preview with confirm/retake options |
IMPROVED |
Old app relied heavily on HyperKYC/HyperSnap native SDKs which don't work on web. New app uses image_picker for capture + backend liveness check, making it web-compatible.
| Feature | Old App | New App | Status |
| Signature Input |
Custom canvas + Syncfusion integration |
signature package (SignatureController, pen stroke=3) |
SAME |
| Clear/Retake |
Full canvas clear, user must redraw |
Clear button, signature validation (not empty) |
SAME |
| API Calls |
proof/getSignatureDetails proof/uploadSignatureImageProof proof/updateStage |
getSignatureDetails uploadSignature |
SAME |
| Attempt Limit |
Backend-controlled |
Max 3 upload attempts with counter |
IMPROVED |
| Output Format |
PNG base64 |
PNG bytes → base64 |
SAME |
| Feature | Old App | New App | Status |
| Screen Scope |
Other Details: Personal + Investment prefs + FNO activation + E-sign (massive screen, ~500+ lines cubit) |
Combined: Personal Details + Investment + F&O + Income Proof + Nominees (4 accordion sections). Stage 10 merged in. |
CHANGED |
| Personal Fields |
Occupation, Annual Income, Existing KYC, Marital Status, Education, Employment, Business details |
Education, Occupation, Marital Status, Father/Spouse Name, Mother Name, PEP declaration |
CHANGED |
| Annual Income |
Collected here (5 brackets) |
Moved to Stage 6 (Bank Verification) per BRD |
CHANGED BRD |
| Investment Section |
Investment objectives, Risk appetite, Investment experience, Years in current job |
Trading experience, Settlement preference (T1/T2/T3), DIS booklet, DDPI enabled |
CHANGED |
| F&O Activation |
FNO opt-in toggle + risk disclosure + e-sign flow |
Enable F&O checkbox + Enable Equity + F&O risk acceptance + income proof upload |
CHANGED |
| Income Proof |
Separate screen (income_proof feature) with OneMoney WebView |
Merged into Stage 9 F&O section. File upload (PDF/JPG/PNG) + OneMoney bank connection button. |
CHANGED |
| Nominees |
Separate add_nominee screen: Name, PAN, DOB, Relationship, Gender, Full Address, Mobile, Email, Nomination % |
Bottom sheet form: Name, PAN, DOB, Relation. Up to 3 nominees. "No nominee" declaration option. |
CHANGED |
| E-Sign in Details |
Digio/EMudhra e-sign initiated from Other Details if FNO opted |
E-sign is a separate Stage 13 (not mixed with personal details) |
IMPROVED |
| initSuperApp |
Called unconditionally on page load (OPT-2 issue) |
Not used (session already initialized at Stage 0) |
IMPROVED |
| Lookup Dropdowns |
Hardcoded dropdown options |
Field codes match ekyc.lookups table (backend-driven dropdowns) |
IMPROVED |
BRD Change - Annual Income Relocation: Income collection moved from Stage 9 to Stage 6 per "Bank verified auto movement and Annual Income relocation_BRD.docx". This reduces Stage 9 complexity and captures income earlier in the flow.
In the old app, Income Proof was a separate screen with OneMoney WebView redirect. In the new app, this has been merged into Stage 9 (Personal Details, F&O accordion section). Stage 10 auto-redirects to Stage 9.
| Feature | Old App | New App | Status |
| Purpose |
No dedicated validation screen. Backend validates during stage transitions. |
Dedicated validation screen with animated progress and check items. |
NEW |
| User Input |
N/A |
None (passive - backend runs checks) |
NEW |
| Visual Feedback |
N/A |
Animated circle (0-100% over 8s), 5 check items with pending→spinning→green checkmark animation |
NEW |
| Checks Displayed |
N/A |
1. Verifying identity, 2. Checking PAN records, 3. Validating bank, 4. Running compliance, 5. Preparing documents |
NEW |
| API Calls |
N/A |
runFinalValidation |
NEW |
This is a UX improvement - gives users visual feedback during the backend compliance/validation process instead of a generic loading spinner.
| Feature | Old App | New App | Status |
| Purpose |
No dedicated document generation screen. AOF generated as part of e-sign flow. |
Dedicated screen: generates AOF PDF, shows download option, then proceeds to eSign. |
NEW |
| PDF Download |
Not available separately |
Optional download button (opens in external browser) |
NEW |
| Document Type |
Implicit |
Returns documentType: NEW_KRA, KRA_MODIFICATION, or KRA_VALIDATED |
NEW |
| Feature | Old App | New App | Status |
| eSign Providers |
Digio (primary) + EMudhra/NSDL (backup) + Non-KRA path. 5 separate API endpoints. |
Single WebView-based eSign. Backend selects provider (eMudhra/HyperVerge). |
IMPROVED |
| Provider SDKs |
Digio SDK EMudhra SDK |
webview_flutter (WebView for all providers) |
CHANGED |
| Already Signed Check |
Not in UI (backend checked) |
getEsignDetails() checks isSigned - auto-skips to Stage 14 if already signed |
IMPROVED |
| Screen Placement |
Mixed into Other Details screen (Stage 9) for FNO e-sign |
Dedicated standalone Stage 13 |
IMPROVED |
| Callback Handling |
SDK callbacks via native code |
WebView URL interception for 'esign-callback' / 'callback' patterns |
CHANGED |
| Feature | Old App | New App | Status |
| Purpose |
No dedicated account creation screen. Account created as part of success flow. |
Dedicated screen with animated "Creating Your Account..." messaging + progress bar. |
NEW |
| STP vs Non-STP |
Determined by backend, reflected in Account Success screen |
Determined by accountStatus response. CREATED=STP, PENDING_REVIEW=Non-STP |
SAME |
| Error Handling |
Generic error |
BE_ACC_PENDING_VERIFIER error code treated as Non-STP (graceful handling) |
IMPROVED |
| API Calls |
Part of combined flow |
createAccount → returns accountStatus, clientId, dpId |
IMPROVED |
| Feature | Old App | New App | Status |
| STP Variant |
Client code + scheme recommendations + scheme upsell |
Client ID + DP ID + OTP info ("Your 4-digit OTP is last 4 digits of mobile") + animated celebration |
CHANGED |
| Non-STP Variant |
Account success message only |
"Thank You! Application submitted for verification" + update notifications message |
IMPROVED |
| Fund Transfer |
Separate fund_transfer feature with Razorpay Custom UI, AES encryption, 3-wave init (9 endpoints), UPI/NetBanking/Card options |
Integrated "Add Fund" button + amount input + Razorpay checkout (simplified). Uses initiatePayment + paymentCallback. |
CHANGED |
| Fund API Calls |
9 endpoints: GetEPayToken, ValidateToken, GetClientBankDetails, GetDownTime, UpdateVpa, CreateTransaction, UpdateTransaction, SaveSchemeDetails, InsertSegmentDetails (Fund Base URL + Basic Auth + AES) |
getPaymentDefaults initiatePayment paymentCallback |
IMPROVED |
| Scheme Selection |
Scheme recommendations + save scheme + segment details (upsell post-creation) |
Not present (removed upsell flow) |
REMOVED |
| WhatsApp Updates |
Optional toggle for WhatsApp notifications |
Not present |
REMOVED |
| Login/Exit |
"Go to Rise" CTA + "Download Statement" |
"Login to RIISE" (external link) + "Back to Home" (clears storage, returns to Stage 0) |
SAME |
| Animation |
Lottie congratulation animation + tick animation |
Scale-in animation (elasticOut curve). Lottie congrats available but not yet integrated. |
CHANGED |
Features Removed or Merged in New App
| Old Feature | Old Screen | New Status | Reason |
| US Equity Verification |
us_equity_verification, us_equity_success, us_equity_error_exit |
REMOVED |
US Equity flow deprecated. FATCA/PEP handled at backend level if needed. |
| Add Fund Popup |
add_fund_popup |
MERGED |
Merged into Stage 15 (Congrats) as inline "Add Fund" section. |
| Separate Income Proof |
income_proof |
MERGED |
Merged into Stage 9 (Personal Details, F&O accordion). |
| Cancel Transaction |
fund_transfer/CancelTransactionScreen |
REMOVED |
Simplified fund flow uses Razorpay checkout directly. |
| WebView NetBanking |
fund_transfer/WebViewNetBankingScreen |
REMOVED |
Razorpay handles payment method selection internally. |
| Verify PAN/Aadhaar Display |
verify_pan_aadhar (display proof images) |
REMOVED |
Proof image viewing not needed in new flow. Backend stores proofs directly. |
BRD-Driven Changes Summary
1. Bank Auto-Verify (Bank_Auto_Verify_BRD_v2.docx)
Change: Replace manual penny drop with UPI Reverse Penny Drop as primary bank verification method. Auto-move to next stage on successful verification.
Impact: Stage 6 redesigned with UPI app selection (PhonePe, GPay, Paytm, Cred, Others). Manual entry becomes fallback. OneMoney removed, Decentro auto-verify added.
Status: Implemented in new flutter_app Stage 6.
2. Annual Income Relocation (Bank verified auto movement and Annual Income relocation_BRD.docx)
Change: Move annual income collection from Personal Details (Stage 9) to Bank Verification (Stage 6).
Impact: Stage 6 now shows income range selector after bank verification. Stage 9 no longer collects annual income.
Status: Implemented in new flutter_app Stage 6 (verified state shows 5 income ranges).
3. KRA Customer Skip Logic (EKYC3_BRD_v1.docx)
Change: KRA-validated customers should skip DigiLocker/Aadhaar verification.
Impact: Stage 4 (PAN) checks kraStatus. If VALIDATED, skips Stage 5 entirely. Stage 5 also checks isKraCustomer and auto-navigates away.
Status: Implemented in Stages 4 and 5.
4. KRA eSign Pending Flow (EKYC3_BRD_v1.docx)
Change: If KRA eSign is pending, customer should skip directly to eSign stage after OTP.
Impact: Stage 2 (OTP) checks kraEsignPending in response. If true, navigates directly to Stage 13 (eSign), bypassing all intermediate stages.
Status: Implemented in Stage 2.
5. Session Timer & Handoff Link (EKYC3_BRD_v1.docx)
Change: Add session inactivity timer (15 min) with warning dialog. Add handoff link for cross-device continuation.
Impact: New session_timer.dart widget added. 13-min warning dialog with "Continue" option. Not present in old app.
Status: Implemented as cross-cutting widget in new flutter_app.
Third-Party SDK Comparison
| SDK | Old App | New App | Change |
| HyperKYC / HyperSnap |
v2.6.0 / v7.2.0 - Native selfie liveness |
Not used - image_picker + backend liveness |
REPLACED |
| AINxt DigiLocker |
Native SDK - Aadhaar + liveness alternative |
Not used - WebView DigiLocker |
REPLACED |
| Digio |
Native SDK - eSign |
Not used - WebView eSign |
REPLACED |
| EMudhra |
Native SDK - eSign (NSDL) |
Not used - WebView eSign |
REPLACED |
| Razorpay |
Custom UI v1.4.1 (full control: UPI, card, netbanking) |
Standard Checkout (simplified) |
SIMPLIFIED |
| OneMoney |
Bank verification + income aggregation |
OneMoney for income (in Stage 9), Decentro for bank (Stage 6) |
SPLIT |
| Google Sign-In |
Email verification alternative |
Email verification alternative (same) |
SAME |
| Geolocator |
Registration + Selfie location |
Stage 0 + Stage 7 location |
SAME |
| Firebase/CleverTap/AppsFlyer |
Analytics: Firebase 11.4.2, CleverTap 3.7.0, AppsFlyer 6.16.2 |
Not yet integrated |
NOT YET |
New app replaces native SDKs with WebView-based integrations for DigiLocker and eSign. This makes the app web-compatible but may need native SDK integration for mobile production builds.
API Architecture Comparison
| Aspect | Old App | New App |
| Total Endpoints |
74 endpoint constants, 87 invocations across 13 repos |
~35 methods in unified ApiService |
| HTTP Client |
Dio with interceptors (error + logging), 60s timeout |
http package, 30s timeout (ApiConfig.apiTimeout) |
| Base URLs |
2: Main API + Fund/ePay API (separate base URLs, separate auth) |
Single base URL (fund transfer integrated into main API) |
| Auth |
JWT token (optional per call) + Basic Auth (fund transfer) |
Bearer token (X-Lead-Id, X-Session-Id auto-injected) |
| State Management |
BLoC/Cubit (flutter_bloc ^9.1.1) - separate cubit per feature |
setState (vanilla Flutter) - all state in screen widgets |
| Repository Pattern |
13 feature-specific repository implementations |
Single ApiService class with all methods |
| Request Models |
Typed Dart classes (PostRequest / Req) per endpoint |
Inline Map<String, dynamic> in ApiService methods |
| Response Models |
Typed Response classes per endpoint |
ApiResponse<T> with generic data parsing |
Navigation Flow Comparison
Old App (Happy Path)
Registration→
Mobile OTP→
Email→
PAN + DigiLocker→
Verify Proof→
Bank→
Selfie (HyperKYC)→
Signature→
File Upload→
Other Details + eSign→
Income Proof→
Account Success
New App (Happy Path)
Stage 0: Arrival→
Stage 1: Registration→
Stage 2: OTP→
Stage 3: Email→
Stage 4: PAN→
Stage 5: DigiLocker→
Stage 6: Bank + Income→
Stage 7: Liveness→
Stage 8: Signature→
Stage 9: Personal + Nominee→
Stage 11: Validation→
Stage 12: Document→
Stage 13: eSign→
Stage 14: Account Creation→
Stage 15: Congrats + Fund
Green = New stages not in old app
Cross-Cutting Features Comparison
| Feature | Old App | New App | Status |
| Session Timer |
Not present |
15-min inactivity timeout, 13-min warning dialog |
NEW |
| Back Button Handler |
Custom exit popup screen |
Device back intercept with "KYC is one-time" bottom sheet |
IMPROVED |
| Loading Overlay |
LoaderOverlay package + Lottie (ic_loader.json) |
Custom LoadingOverlay widget + Lottie (migrated) |
SAME |
| Progress Bar |
Striped custom painter (StripedProgressPainter) |
Striped custom painter (migrated) - 16 stage names |
SAME |
| Analytics |
Firebase + CleverTap + AppsFlyer (30+ events) |
Not yet integrated |
PENDING |
| Responsive Design |
flutter_screenutil (360x690 base) |
Standard Flutter layouts (no screenutil) |
CHANGED |
| Error Handling |
ApiDataState union (DataSuccess/DataFailed/DataError) |
ApiResponse with success/errorCode/displayMessage + ErrorDialog/SnackBar |
IMPROVED |
| Mock/Dev Mode |
UAT vs Prod base URL toggle |
Mock URL detection (contains 'mock', 'example.com') bypasses external flows |
IMPROVED |
eKYC 3.0 UI Comparison Report • Generated 9 April 2026 • Old: EkycDevProject/Flutter BLoC • New: flutter_app/Flutter setState
BRD Sources: EKYC3_BRD_v1.docx, Bank_Auto_Verify_BRD_v2.docx, Bank verified auto movement and Annual Income relocation_BRD.docx, Journey.docx