
Vaishvik Trader
“A smarter trading terminal for FII/DII flows, pre-open builds and F&O heatmaps.”
One product, scoped and shipped: a trading terminal with FII/DII analytics, heatmaps, a live-and-historical option chain, billing and an admin back office.
- Sector
- Trading / Fintech
- Engagement
- 2026
- Scope
- Single product

Overview
This was a single-product engagement, not a full end-to-end build. We designed and shipped the Vaishvik trading terminal: a Vite/React SPA on a Flask API, covering the market dashboard, FII/DII participant analytics, a configurable stock heatmap, a live and historical option-chain analysis tool, Razorpay billing with coupons and trials, and an admin console.
Scoped tight, delivered clean — the codebase is one frontend, one API, seven MongoDB collections, one-active-session enforcement, and email-verified auth.
The brief
One product, scoped and shipped
Not every engagement is end to end. Vaishvik Traders wanted one thing built well: a trading terminal for Indian retail traders — FII/DII flows, a stock heatmap, and an option-chain tool that works in both live and historical modes — with a subscription and an admin console behind it.
So that's what we built, and only that. A Vite and React single-page app on a Flask API. In 147 days it went from an initial commit to a measured 46,792 lines across one frontend, one backend and seven MongoDB collections — no drift, no half-finished second product.
This page is short on purpose. The engagement was too.
Architecture
An SPA, an API, and a stream
The front end is React 19 on Vite, with Redux Toolkit and Jotai splitting global and local state, ECharts and Lightweight Charts for the visuals, and TanStack Table for the dense grids. The back end is a Flask-RESTX API over MongoDB with JWT auth and a one-active-session rule enforced server-side. A Socket.IO connection carries the live index stream.
Deploy is Gunicorn with gthread workers behind systemd. Market data is fetched through a provider proxy that attaches a service key and checks the caller's subscription on every request — the vendor never sees an end user, and access control isn't trusted from the client.
The dashboard itself does one clever thing: it resolves live index symbols once, then merges each streamed quote into the existing state object rather than replacing it, so the numbers update without the whole panel re-rendering and flashing on every tick.
The option chain
One option chain, two time domains
The option-chain tool is the same table with two different clocks behind it. In live mode it streams the current chain; in historical mode it replays a past session, stepped by interval, off real timestamps.
Making that one component took a normalisation layer: lot sizes are normalised, CSS class strings that the data provider smuggles into payload fields are stripped, the totals row is synthesised rather than trusted, intervals are mapped to timeframes, and the ATM strike is selected from spot context. When the live feed for a symbol is missing, it falls back cleanly rather than rendering an empty grid.
The same table, two different clocks — and a normalisation layer that keeps a missing feed from blanking the grid.

The heatmap
A heatmap that survives messy data
The stock heatmap is configurable along every axis — data source, the metric it colours by, the metric it sizes by, how it groups — and every one of those choices is written to the URL query, so a view is a shareable link.
Rows are normalised against a fallback option set so a missing field doesn't blank a tile. Strongest and weakest stock are computed on the client from the same normalised rows. Fullscreen is real component state, not a CSS class that breaks the moment the layout changes.

Account & billing
The parts that have to reconcile
Behind the terminal is a subscription that has to be exactly right. A 7-day trial, coupon validation across four discount types — flat, percentage, fixed-less and free — and Razorpay checkout with order creation, signature verification on the callback, capture, and a webhook that reconciles the local transaction record against Razorpay's.
Auth is TTL-backed: email-verification and password-reset tokens are hashed and expire on their own via MongoDB TTL indexes. One active session per account is enforced on the server, so a shared login can't run two terminals at once — which, for a paid data product, matters.
The engineering you don't see in a demo.
One option chain, two time domains
The option-chain feature routes between live and historical modes, normalising lot sizes, stripping CSS columns from provider payloads, synthesising totals, mapping intervals to timeframes, and driving a historical replay with real timestamps and ATM-strike selection.
A heatmap that survives messy data
Rows are normalised with fallback option sets; filters stay in sync with the URL query; strongest/weakest stock is computed client-side; fullscreen is real state, not a CSS trick.
Live quotes merged, not replaced
The dashboard resolves live index symbols and merges streamed quotes into existing state rather than swapping the object, so the UI doesn't flash on every tick.
What it runs on.
Measured from the repository, not the pitch.
Discipline is the bridge between knowledge and consistent profits.
Vaishvik Trader · in-product
Committed in the client's repository
Who we worked with.
Abhishek Choudhary
Founder & Proprietor, Vaishvik Traders
Against the baseline.
Reported as change against the engagement baseline. Search figures stay as percentages and multiples on purpose — absolute volume tracks Vaishvik Trader's news and category cycle, so the relative move is the honest measure.
Scope, stack, scale and the engineering above are drawn straight from Vaishvik Trader's codebase and git history.
The takeaway
Scoped work, done without creep
Three dense real-time surfaces, a payment flow that reconciles to the rupee, an admin console, and the small correctness details — the flicker-free merge, the fallback that keeps a missing feed from blanking a grid, the one-session rule — that separate a demo from a product people pay for.
147 days, one product, one team. When the brief is one thing, the right answer is to build that thing well and stop.