work project
Crypto Fund Management Dashboard
Serverless portfolio, market, and risk tooling for fund managers who need the number now.
- TypeScript
- Next.js
- React Query
- Recharts
- Ant Design
- NestJS
- PostgreSQL
- Kysely
- Serverless Stack (SST)
- AWS CDK
- GitHub Actions
- Full-stack serverless dashboard giving fund managers real-time positions across 100+ cryptocurrencies, with valuation, attribution, and reconciliation in one place.
- Built the risk surface — standard deviation, delta, and asset correlation — as precomputed metrics so a 100-asset correlation matrix renders instead of timing out.
- Owned the whole stack: SST / AWS CDK infrastructure as code, the NestJS API, the PostgreSQL schema and migrations, and the Next.js frontend.
What it was
A dashboard for people who manage other people’s crypto. It pulled positions, on-chain transfers, and market data together into one view: daily valuations, profit and loss with top contributors and detractors, a risk panel, live market data with pinned assets, and a reconciliation screen for arguing with the numbers when they disagreed.
What made it hard
Market data providers rate-limit you, and they do not agree with each other. Two feeds will quote the same asset at meaningfully different prices at the same second, and a portfolio valuation built on the wrong one is wrong in a way a fund manager will notice immediately. On-chain transfers have to reconcile against internally recorded positions, and when they do not, someone needs a screen that shows them exactly where the gap is rather than a support ticket.
The risk metrics were the other half of it. Standard deviation and delta are cheap. A correlation matrix across 100+ assets over a meaningful time window is not, and it does not fit inside the patience of a person staring at a loading spinner, let alone a Lambda timeout.
What I owned
All of it. I architected the serverless infrastructure with SST and AWS CDK, built the NestJS backend covering portfolio tracking, data ingestion, risk calculation, and auth, designed the PostgreSQL schema and wrote the migrations, and built the Next.js frontend with its charting and reconciliation surfaces. I set up the CI/CD pipelines for staging and production deploys.
The decision I would defend
Precompute. Daily valuations and the risk metrics are calculated on a schedule into materialized tables, and the dashboard reads those rather than computing anything on request.
The obvious cost is freshness: the numbers are only as current as the last run, and if a job fails you are showing stale data with full confidence unless something in the UI says otherwise. The obvious win is that the expensive views became instant, and the API stopped being a place where requests went to die. For a tool people open in the morning and check through the day, I would take that trade again — but only alongside the thing I got wrong about it.
Where it landed
Fund managers got real-time visibility across 100+ cryptocurrencies with automated risk analysis feeding actual trading decisions, on a serverless footprint that cost roughly nothing on quiet weekends.
What I would do differently
Two things, and the first is the sharper one. We shipped the product describing itself as real-time while most of the interesting figures were batch-computed overnight. Both statements were defensible in isolation and together they were misleading. Every number should have carried an “as of” timestamp in the first release, not after a fund manager asked why a position had not moved all morning. That is a five-minute component and it was a credibility problem.
Second, infrastructure as code was right, but I modelled the whole system as a single SST stack. That meant a routine API change and the database lived in the same deploy unit, so rolling back a bad application deploy meant a stack operation that touched RDS. Stateful and stateless resources should have been separate stacks with separate lifecycles from the beginning, and retrofitting that split later is considerably less fun than doing it on day one.