CapitalOS
A real-time stock market tracker for monitoring positions, watchlists, and market movements. Built end-to-end as a personal project to explore real-time data pipelines, financial APIs, and a clean trader-focused UI.
Built with boring tools
that do the job.
The brief was: fast, reliable, easy to ship, easy to iterate. The stack reflects that — modern enough to move quickly, conservative enough to not fight me at 11pm on a Sunday.
projects/capitalos.aspx and edit the .tech-chip blocks — the layout adjusts automatically.
How the pieces
fit together.
A walk through the moving parts — what talks to what, where the data lives, and where caching and rate-limiting sit so the third-party market API doesn't get hammered.
Frontend — Next.js app
Server-rendered pages for the dashboard, watchlists, and individual ticker views. Client-side state for live price updates and chart interaction. Routes are file-based so adding a new view is just adding a new file.
API layer — Node backend
Thin API layer sitting between the frontend and the market data provider. Handles authentication, request shaping, and a small cache so common ticker lookups don't hit the upstream every time.
Market data ingestion
Pulls quote data and historical bars from a financial market API. Rate-limited and cached so heavy use of the dashboard doesn't burn through the upstream quota.
Persistence — Postgres
User accounts, watchlists, saved positions, and historical snapshots. Schema kept deliberately small — just what's needed to make the app stateful between sessions.
Realtime updates
Live prices polled at a sensible interval (the upstream isn't a websocket source) and pushed to the UI. Charts redraw incrementally rather than from scratch to keep the page calm under load.
Deployment — Railway
One-click deploys on push to main. Postgres and the web service live in the same Railway project so the DB connection string is wired up via environment variables, no manual config.
Custom tools, dashboards,
and data-driven web apps.
CapitalOS is a personal build, but the same approach — full-stack TypeScript, a clean UI, and a deployment that doesn't fight you — works for client work too.