Selected work

Systems engineering

Portfolio dashboard

A personal finance dashboard that replaced a spreadsheet — and turned into an exercise in how to fetch data from providers that do not want to be fetched from.

  • Node.js
  • Express
  • React
  • Vite
  • REST

Context

This started as a way to stop maintaining a portfolio spreadsheet by hand: a Node/Express API reading the workbook and exposing JSON, with a React and Vite frontend over it. The interesting part was not the charts. It was pricing.

The engineering

  1. The naive version got rate-limited into failing

    The first implementation raced three price providers per ticker. With a few dozen holdings that is hundreds of outbound requests in a burst, and the providers responded exactly as you would expect. The rewrite is bulk-first: ask each source for many symbols in one request where the API allows it, so the same portfolio costs a handful of requests instead of hundreds.

  2. A fallback chain, ordered by cost rather than preference

    Sources are tried in a defined order, batched where possible, falling back to per-symbol lookups and finally to whole-market end-of-day files that answer for every symbol in a single request. Each tier is cheaper to the provider and slower or staler for the user, which is the right trade to make explicitly rather than accidentally.

  3. Caching by how fast the underlying data actually changes

    Quotes are cached for minutes, bulk market files for longer, and symbol-to-identifier lookups for a week, because those three things change at completely different rates. Picking one cache TTL for everything would have been simpler to write and wrong for at least two of the three.

  4. The deployed environment is not the dev environment

    Some providers are reachable from a home connection and blocked from a cloud datacenter IP. That is not something you can test locally, so the app exposes a diagnostic endpoint that reports which providers *this* instance can actually reach — observability for a failure that only exists in production.