Project
Open Banking Financial Dashboard
Zero-to-one TypeScript monorepo ingesting a decade of transaction history across 10+ banks, with WebAuthn 2FA and an LLM advisory layer in flight.
- TypeScript
- NestJS
- React
- Vite
- PostgreSQL
- Prisma
- WebAuthn
- JWT
- Plaid
Core problem
Personal finance dashboards either flatten data into shallow summaries or stop at recent transactions. The goal: ingest 10+ years of historical transaction data across 10+ banking institutions and ground a future LLM advisory layer on that long-tail history — securely.
Business impact
Solo-architected and shipped — an end-to-end, production-grade FinTech platform demonstrating the full stack a regulated AI product requires: secure data ingestion, strong identity, contract-typed APIs, and a route to grounded LLM features.
Architecture
System Overview
This diagram maps the high-level boundaries of the application's tiered, TypeScript-driven monorepo. It illustrates how the React (Vite) client and NestJS server maintain strict end-to-end type safety through a shared contracts package. Furthermore, it outlines the clean separation of concerns between the internal persistence layer (managed via Prisma and PostgreSQL) and the secure integrations with external, third-party services like the Plaid API and browser-native WebAuthn hardware authenticators.

Passwordless Authentication Flow
This flow details the robust, multi-stage authentication system, focusing specifically on the integration of WebAuthn for passwordless passkey verification. It visualises the critical decision forks where the API determines MFA requirements, and maps the complete lifecycle of cryptographic challenges—from generation on the server, to secure signing via hardware authenticators (like TouchID or YubiKeys), and finally to verification and database persistence to protect against replay attacks.

Plaid Integration & Data Sync Engine
This diagram breaks down the application's most complex integration: the Plaid bank linking and data ingestion engine. It is separated into chronological phases, starting with the initial secure token exchange via the Plaid drop-in UI, and culminating in a robust, cursor-based polling loop. This polling loop fetches newly synced financial transactions, handles deduplication, and concurrently executes bulk database UPSERT operations to seamlessly transition the user directly into their populated dashboard.

