Darshi Shah

LendSight: benchmarking and predictive modeling for community banks

LendSight is a B2B SaaS dashboard that gives community banks and credit unions the deposit pricing intelligence that only large banks could afford before. It's built on public FDIC, FFIEC, and NCUA data.

The product started at the Georgia Tech Financial Services Innovation Lab. The Lab had the research and the federated data feeds but no product. I joined as the lead designer with no existing designs and no design system, and over ten months I took it from concept to a working product now in pilot with a Georgia-based credit union.

Role
Lead Product Designer
Timeline
10 months (Jun '25 to present)
Scope
Product Strategy, Stakeholder Research, Design Systems, Interaction Design, Claude Code Prototyping
Tools
Figma, Figma MCP, Storybook, Claude Code, React, shadcn/ui, Supabase
LendSight Products Analytics — the Certificate of Deposit benchmarking view: sticky top filters, market-position stat cards, and a rate-distribution chart across the peer set.
LendSight predictive modeling view — projected deposit rates and forecast scenarios for the peer set.
Overview
Impact

A Live Pilot and a Predictive Model in Active Use

A Georgia-based credit union is piloting LendSight live and sending back suggestions that shape the product. So far the pilot has cut analyst time on weekly benchmarking by about 40 percent. The predictive model runs inside the pilot and gets refined by the credit union's feedback. The next step is to roll it out to more small banks and credit unions.

40%
less analyst time on weekly benchmarking work at the pilot credit union
1
credit union piloting live and feeding suggestions back into the product
Live
predictive model running in the pilot, refined by the credit union's feedback

"A tool like this could reduce manual work, especially when analysts need to communicate with higher-level decision makers."

Georgia credit union member, pilot review
Problem

The Banks That Need Pricing Intelligence Most Cannot Afford It

Large banks set deposit rates using platforms like Curinos and S&P that cost fifty thousand to five hundred thousand dollars a year. Community banks and credit unions can't pay that, and their margins depend on getting deposit pricing right just as much.

Their fallback is manual. Analysts pull FDIC and NCUA filings by hand, copy the numbers into spreadsheets, and rebuild the same comparisons every week. A basic question, like what the market is doing on six-month CDs in Atlanta this week, took two days to answer. Turning that answer into a one-page CFO summary took two more.

The before
Duration: 4 days
A four-day weekly cycle
Three inputs, keyed by hand, rebuilt from source every week.
FDIC and NCUA rate filings
Manual extract
Inst.6mo12moAPY
Bank A4.054.204.11
Bank B3.924.053.98
Bank C4.154.334.19
Bank D3.884.003.90
Bank E4.024.184.07
Bank F3.994.114.03
Bank G4.104.254.14
Rebuilt competitor comp sheet
Re-keyed weekly
To[redacted]
Subj6mo CD market position
6-month CD levels vs. peer set, wk ending [date]. Sheet attached.
CFO rate summary
Deliverable, +2 days
Solution

An Analyst-First Benchmarking and Predictive Modeling Platform

LendSight sits deliberately below the enterprise pricing tools. It runs on a shared Supabase backend with an OpenAI integration for natural language queries. The product has two main features.

Products Analytics for Peer Benchmarking

Analysts benchmark deposit and lending products against competitors across product, term, deposit amount, institution type, geography, and demographics. The results render two ways: an interactive chart, or a sortable table. Changing a filter repaints the view in place, so the tool moves at the speed of the analyst's questions.

Products Analytics — adjust the filters and the CD peer set narrows to match, repainting the view in place.
Products Analytics — change the term filter from 6 to 12 months, the chart and table repaint in place.

Predictive Modeling as the Technical Centerpiece

An analyst sets a target APY, then adjusts macro inputs like GDP growth, unemployment, and Treasury yields. The model returns projections under Baseline and Severely Adverse conditions over a quarterly or annual horizon. A tornado chart ranks the inputs that drive the forecast.

Predictive Modeling — macro and behavioral inputs up top, the 9-quarter deposit path under Baseline and Severely Adverse, and the tornado of what moves it most.
Additional info
Process

Ten Interviews and One Workshop

Working at a research lab gave me stakeholder access most designers never get. Over three months I ran over ten structured interviews with pricing analysts at Bank of America, Charles Schwab, and Experian, two finance academics, and both analysts and a board member at the Georgia credit union. A FigJam workshop covered problem framing, users, data sources, and prioritization.

Bank of America Charles Schwab Experian
1

Analysts Think in One Mode at a Time

A combined institution-and-product view confused them. They had separate use cases for when they were seeking product-related versus institution-related data.

2

Speed of Input Change Is the Value, Not the Chart

A filter that takes two seconds breaks the workflow. The dashboard had to feel like a spreadsheet that paints itself.

3

Context Matters as Much as the Number

Knowing a bank offers 4.5 percent isn't enough. Analysts also want to know how strong it is, how recently it moved rates, and whether it's a real competitor.

4

The Macro Scenario Is the Fed's Job, Not the Bank's

A community bank has no house view on the 10-year Treasury. The Fed publishes the scenarios, and the bank models its own book against them. This finding split the model's inputs into three groups, Fed-published, bank-owned, and model-owned, and became the spine of the module.

How the Deposit Model's Inputs Come Together

The bank sets its own data once a month: its deposit book by product, its current offered rate, and behavioral assumptions like deposit beta and runoff rate. The Fed provides ten economic paths across nine quarters. The analyst chooses which scenario to run. The model converts the macro paths into deposit flows and produces a nine-quarter balance path and cost of funds, shown as a sensitivity tornado, a cost-of-funds view, and a projected balance with baseline and adverse scenarios.

The inputs · three sources, gathered before a run
Step 1 · The bank
Set once a month
Bank core banking system
Monthly data export
Deposit book, by product type
Balance, current rate paid, and CD maturity dates for each segment
Starting point
Today's offered rate + the as-of date. Everything is measured against this.
Behavioral assumptions
Deposit beta (how fast the bank's rate follows the market), runoff rate, surge-balance share
Step 2 · The Fed
Provides the economy
Federal Reserve
2025 Supervisory Scenarios
10 economic paths over 9 quarters
GDP growth, unemployment, inflation, Treasury & mortgage rates, BBB yield, house-price and commercial-property indexes
Shared by every bank. You choose which to run, not what's in them.
Step 3 · The user
Chooses what to run
Required
Pick one scenario
Baseline (Fed's expected case), Severely Adverse (Fed's stress case), or a saved Custom workspace
Optional
Adjust this run only
Nudge a macro endpoint, or stress deposit beta higher. Not saved unless you save it.
All three inputs feed into the model
Step 4 · The model
The backend model runs the calculations
a
Read the scenario. Take the Fed's 10 macro paths, quarter by quarter, and compute each driver's move against the scenario's own baseline
b
Convert to deposit flows. Apply the model's coefficients and every behavioral parameter together: deposit beta, runoff, surge-balance unwind, and stickiness
c
Produce two tracks. A deposit balance path across all 9 quarters, and cost of funds over the same horizon
Step 5 · On screen
What the run produces
Sensitivity tornado
Ranks which inputs move the forecast most
Cost of funds + interest expense
What the deposits cost over the horizon
Projected deposit balance
9-quarter line with best / base / worst band
Summary cards: ending balance, net change, total interest
Legend
Bank
Fed
You
Model
Output
= user input
The input-ownership decision that became the spine of the deposit model, every block colored by who owns it (bank, Fed, user, model) and shaped by what it is.
Design System

A Foundation Tuned for Dense Analytics

I built every component in Figma, documented it in Storybook with variants and states, and saved it as tokens for Claude Code. Color, type, spacing, and motion tokens map one to one from Figma into the build, so the product looks identical to the design file.

Building the system in month two was a decision I'm glad I made early. The screens are dense, and consistent tokens and components kept them readable as the product grew. I've covered the system in a separate case study.

View Design System Case Study

Key Decisions

Three Calls That Changed the Product

Splitting the Institution View from the Product View

The first build combined both contexts on one canvas, so analysts toggled between two mental modes and lost their place. Splitting the views lowered cognitive load and shortened the path from question to pricing decision. That structure carried through the rest of the dashboard.

BeforeBefore: one canvas titled Institutions & products, mixing institution and product context in a single view.
AfterAfter: a focused single-product benchmarking view, one cognitive mode at a time.

One canvas that mixed both contexts became a focused, single-product view. Analysts stopped losing their place between modes.

Sticky Top Filters Instead of Side Filters

The original layout kept filters in a side panel, which narrowed the canvas and added friction to a cycle analysts repeated all day. Moving the filters to a sticky top bar freed the width and sped up the loop. The collapsable side nav now handles module switching.

BeforeBefore: filters live in a left-hand panel that eats canvas width.
AfterAfter: filters move to a sticky top bar; the side nav is reserved for module switching and the canvas gets wider.

Filters left the side panel for a sticky top bar. The canvas widened and the question-to-answer loop got faster.

One Screen for the Deposit Model Instead of Two

The initial design split data upload and model runs across two screens. The data changes once a month, but analysts run the model many times in a session to test what-ifs, so splitting by screen sent them back to setup on every run. So, I split by cadence instead. The monthly upload moved into a drawer that opens only when the data changes. The analysis lives on one screen where analysts adjust inputs and read results together. This made the what-if loop work faster.

BeforeBefore: a setup screen where you upload documents and enter inputs, then run the model once and results open on a separate next screen.
AfterAfter: inputs and the projected deposit path share one screen, with monthly setup moved into a drawer.

Inputs and outputs moved onto one screen so the what-if loop stays intact. Monthly setup moved into a drawer, splitting the flow by cadence instead of by control versus output.

Build

A Figma to Claude Code to Supabase Loop

I designed in Figma with the token system as the source of truth, rebuilt the high-priority screens in Claude Code using those same tokens, and documented each component in Storybook before it reached the live app.

Each weekly cycle moved from Figma to a Claude Code build to Storybook docs to a demo with the credit union, then back to Figma. The cycles took hours rather than weeks, which meant a feature requested on Monday could reach the pilot the next Monday.

Working in real code surfaced issues a static file can miss. Filter behavior that reads well in Figma can break when four filters are applied at once and the chart redraws. Seeing that early let me fix the design instead of patching the build.

One feature · one week
The build loop
How a single feature moves from design to pilot users and back again. Closing the loop every week.
Figma
Design
Claude Code
Build
Storybook
Document
Supabase
Data
Pilot demo
Validate
tokens
components
live data
queries
feedback → next iteration
Shipped proof
Bank Profiles
Requested Monday → shipped the following Monday.
The weekly loop: Figma design → Claude Code build → Storybook documentation → Supabase data → pilot demo, then the accent-orange edge carries feedback back to Figma for the next iteration. Bank Profiles was requested on a Monday and shipped the following Monday.
Figma
filter / Product
Product CD
Storybook
ProductCD Default
ProductCD Active
ProductCD Hover
ProductCD Disabled
PropTypeDefault
stateenumdefault
activebooleanfalse
disabledbooleanfalse
Build
FilterChip.tsx
1234567891011121314
import { forwardRef } from 'react';
export const FilterChip = forwardRef((props, ref) => {
const { category, value, icon, active = false, disabled, onSelect } = props;
return (
<button ref={ref} disabled={disabled} onClick={onSelect}
className={cx('rmt-chip', active && 'rmt-chip--active')}>
<span className="rmt-chip__icon">{icon}</span>
<span className="rmt-chip__cat">{category}</span>
<span className="rmt-chip__value">{value}</span>
<ChevronDown className="rmt-chip__chev" />
</button>
);
});
One filter chip across all three surfaces: the Figma component, its Storybook states and props, and the FilterChip source in the shipped Claude Code build. All three read from the same tokens, so the build matches the design file with no translation step in between.
Reflections

What I Would Do Differently and What Is Next

Piloting earlier was the thing I'd change most. The most useful feedback of the whole project came from the first credit union session, so getting there in month two instead of month four would have saved a round of overbuilt work.

The design system was the right call. Building it early kept the dense screens consistent as the product grew, and skipping it would have slowed everything that came after.

The roadmap is to roll the product out to more small banks and credit unions and add a second pilot institution for cross-validation.