Sahi — Loan Reject KYUN?
200 million Indians have no credit history. When banks reject them, they're told nothing. Sahi changes that. Most loan apps give you a score — Sahi tells you WHY you'll be rejected, and exactly how to fix it, before you ever apply.
Inspiration
In India, over 200 million first-time borrowers (students, gig workers, small shop owners) have no credit history — a "thin file." When they apply for a loan, most get rejected with zero explanation. Worse: every rejection is recorded on their bureau report, making the next loan even harder.
What it does
Sahi is an explainable loan-readiness checker that runs entirely in your browser — no signup, no PAN, no server-side personal data:
- 🏦 Bank-grade underwriting: FOIR/DTI with income-slab policy caps, 2-step max-loan eligibility (allowed-EMI present value + income multiplier), risk-based rate bands
- 📊 Bureau-style score (CIBIL 300–900 / FICO 300–850) with real bureau factor weights (payment history 35%, utilization 30%, history 15%, mix 10%, inquiries 10%)
- 🔍 Reason codes — the core innovation: top weak factors with exact contributions (informed by XGBoost + SHAP trained on German Credit, holdout AUC 0.814)
- 🎮 What-If Simulator (no market app has this): tap "6 months punctual EMIs" → score NA/NH → 797, approval 25% → 71%, max loan ₹74K → ₹1.45L — live
- 🌍 Multi-region: India (CIBIL/FOIR/DPDP), US (FICO/43% QM DTI), EU (GDPR) — currency, caps, bands switch dynamically
- 📄 Accessible PDF readiness report · 🔐 Zero-knowledge sync (AES-256-GCM ciphertext only)
How we built it
Modular ES6 (8 modules) with a Python bundler → resilient single-file artifact. ML: XGBoost + SHAP (UCI German Credit, 1,000 applications) tuned the scorecard's reason weights. Compile-time types via @ts-check + JSDoc — tsc strict, 0 errors. Crypto: PBKDF2-SHA256 (120k iters) + AES-256-GCM; FastAPI+PostgreSQL backend stores only ciphertext indexed by token hash. WCAG 2.1 AA: focus-trapped dialog, roving-tabindex tabs, aria-live, reduced-motion. 50-assertion test suite incl. 500-case fuzz — all green.
Challenges we ran into
- Making SHAP's one-hot contributions human-readable (aggregated back to 20 original attributes)
- Strict-mode TypeScript on DOM-heavy code without losing runtime simplicity
- WCAG-compliant focus traps (Esc always releases — no keyboard trap)
- NA/NH edge case: users with no history can't improve a score that doesn't exist — so "punctual payments" simulation also creates history, like real life
Accomplishments we're proud of
50/50 tests green · bank formulas verified against published lender methodology · a what-if simulator that CIBIL, Paisabazaar, OneScore don't offer · zero-PII architecture: breach the server, steal nothing.
What we learned
Explainability IS the product. A score without a reason is anxiety; a score with a reason and a fix is empowerment.
What's next for Sahi
Retrain on India-specific data (Home Credit dataset) · LLM-powered explanations in Hindi + regional languages (integration slot built) · lender partnerships for pre-qualification pilots.
MADE BY [ SAMARTH MISHRA ]
Built With
- aes-256-gcm
- es6-modules
- fastapi
- html5
- javascript
- postgresql
- python
- scikit-learn
- shap
- sqlalchemy
- streamlit
- typescript-checkjs
- wcag21
- webcrypto
- xgboost
Log in or sign up for Devpost to join the conversation.