Aug 2026 - Sep 2026  ·  Dhan Web  ·  Live

Building the Dhan Charts design system from scratch

Designed the first-party charting system for Dhan Web, 225 custom icons, foundational tokens, and chart-native components powering the most-used trader surface on the platform.


Overview

What's Dhan?

Dhan is a technology-led stock trading platform built for India's active market participants, from Super Traders who need speed and F&O capabilities to long-term investors focused on SIPs and IPOs.


Team & my role

1 - Product Manager

1 - Product Designer (Myself)

Charts Engineering Pod

What shipped

289
named colours, sizes and spacings, in 3 themes
62
reusable building blocks
225
icons drawn for the terminal
86
product screens rebuilt from the blocks

Context

Why charts matter?

Charts are where traders spend most of their time. It's how they read the market, spot a trend, and decide when to buy or sell. If the chart is slow, cluttered, or feels off, the whole app feels off.

Until now, Dhan Web ran on TradingView and ChartIQ, both rented from third parties. Dhan decided to ship its own charts as the default, with a switcher so traders can still pick TradingView or ChartIQ if they want.

Owning the chart means owning the most important surface on the product, without taking anything away from traders who love their existing setup.

The pre-DS charting experience, ICICI Bank chart with a vendor-styled panel overlaying the Dhan-themed canvas

Problem

What's the problem statement?

There was no shared foundation for anything chart-related. Every chart-adjacent feature was rebuilt from scratch by whichever squad picked it up, so the surface drifted, shipping was slow, and accessibility slipped through the cracks.

Dhan Charts, first-party charting canvas with inline order overlays on the BSE 15-minute chart

Root cause

Why does this problem exist?

The root cause is architectural. Dhan built on top of two vendor charts, so there was never a reason to invest in a first-party chart layer. Moving off them without a design system would just recreate the same fragmentation in-house, on Dhan's own engineering budget.


User & Business Value

Why should Dhan solve for it?

  • For the user: A chart that feels native to Dhan Web, with trader-first interactions like inline orders that vendors don't ship out of the box.
  • For the business: Kill the recurring licensing bill, unblock the roadmap, and turn charts from a rented surface into a differentiator.

Target Audience

Who are we solving for?

  • Traders. From first-day retail users to F&O pros running multi-chart layouts with 6 indicators.
  • Engineers. The Charts Pod and adjacent squads consume the system to ship chart-adjacent features faster.
  • Product & Design. A shared system means new chart features ship in weeks, not quarters.

Constraints

What boundaries did we design within?

  • Native to Dhan Web. Same tokens, same type, same interaction grammar. No seam between "the app" and "the chart."
  • Preserve TradingView muscle memory. Toolbar order, shortcuts, cursor behavior, anything a trader does without thinking, stays put. Zero relearning.
  • Zero existing foundation. Every candle color, crosshair, and axis label had to be defined from scratch.

Key Design Principles

What are the non-negotiables?

  • Familiar by default. High-frequency actions work exactly like TradingView. Novelty is earned, not imposed.
  • Native to Dhan. Every token inherits from Dhan Web. One product, not two.
  • Density with clarity. Dense without becoming noise.
  • Themeable from day one. Light and dark parity, never a phase-two.
  • Chart-native ordering. Orders live on the chart, not next to it.

Foundations

Tokens for financial data

  • Color. Semantic tokens for up/down, order states, and alert priorities, tuned for contrast in light and dark.
  • Typography. Monospaced numerals for prices and PnL so digits align as the market ticks. Body type inherits from Dhan Web.
  • Spacing. A tighter scale than the rest of Dhan Web, tuned for trader density.
  • Radius. A corner scale tuned for chart panels and dense toolbars, softer than Dhan Web so dense surfaces don't feel boxy.
  • Icon size. Fixed size steps for toolbar and inline icons so glyphs align optically at any density.
Dhan Charts foundational tokens, color, typography, spacing

Icon Library

225 icons, drawn from scratch

  • 225 custom icons spanning drawing tools, timeframes, chart types, indicators, and toolbar controls.
  • Drawn on a shared grid with consistent stroke, radius, and optical size, so they sit evenly at any density.
  • Match TradingView-trained expectations at a glance, carry the Dhan visual language up close.
  • Ships as a single versioned library the Charts Pod pulls from, no one-off requests, no drift.
Dhan Charts icon library, 225 icons drawn from scratch
Dhan Charts icon library, detail view

Components

62 building blocks, one contract

  • Every block is named and structured the same way in design and in code, so engineers build exactly what was designed.
  • One table system powers four data-heavy screens, and the order panel matches TradingView control for control, so traders have nothing to relearn.
  • The chart offers 19 chart types and 92 drawing tools.

Button

Button component: 60 by 48 with radius 6 and 16 padding, intent primary, buy, sell, secondary, and tertiary, states default, hover, and disabled, sizes small 26, medium 30, large 48, and options for left icon, right icon, icon-only, and sub label Button component in dark mode: 60 by 48 with radius 6 and 16 padding, intent primary, buy, sell, secondary, and tertiary, states default, hover, and disabled, sizes small 26, medium 30, large 48, and options for left icon, right icon, icon-only, and sub label
  • Every action from Place order and Buy/Sell to Cancel and Reset, sized sm to lg with icon, sub-label, and dropdown options.
  • Powers order panels, dialogs, toolbars, and empty states, so every decision reads the same wherever it appears.
  • Intent and state are baked into the token, so buy stays buy and disabled stays disabled without a designer policing it.

Badge

Badge component: 35 by 18 with radius 4, padding 6, label xs; outline, subtle, and bold variants across neutral, info, success, warning, error, buy, and sell, plus icon, segment, and option type options Badge component in dark mode: 35 by 18 with radius 4, padding 6, label xs; outline, subtle, and bold variants across neutral, info, success, warning, error, buy, and sell, plus icon, segment, and option type options
  • Compact status pills for exchange, order state, and option segment across outline, subtle, and bold styles.
  • Used inside tables, watchlists, order lists, and the option chain to tag each row without extra space.
  • Semantic color lets traders scan Filled, Pending, Rejected, and Buy/Sell at a glance instead of reading text.

Controls

Form controls: switches with toggle off, on, disabled, and label; checkboxes with off, on, mixed, label, and swatch; text inputs across default, focus, number, and error; choose menus across default, filled, open, and disabled; navigation tabs, counter, and slider Form controls in dark mode: switches, checkboxes, text inputs, choose menus, navigation tabs, counter, and slider
  • Switches, checkboxes, text inputs, dropdowns, tabs, counter, and slider: every input the terminal needs.
  • Drives settings dialogs, the order panel, chart configuration, and layout controls.
  • Focus, disabled, and error behavior are shared across the set, so keyboard and screen behavior never diverges.

Feedback

Feedback surfaces: 325 by 60 banners with radius 8 and padding 12 across success, warning, error, and neutral; tooltips at top, bottom, left, and right; and stat tiles for neutral, positive, and negative values Feedback surfaces in dark mode: banners across success, warning, error, and neutral; tooltips at top, bottom, left, and right; and stat tiles for neutral, positive, and negative values
  • Banners, tooltips, and stat tiles for confirmations, warnings, hints, and P&L readouts.
  • Anchored to order placement, margin alerts, layout saves, header stats, and inline chart tooltips.
  • Traders always know what happened and where they stand without leaving the chart.

Table

Table component: 774 by 342 grid with 38 rows and 9 columns showing an Option Chain with depth bars, ATM boundary marker at strike 19,604.25, and row actions for Buy, Sell, chart, and save; alongside a Watchlist table with Symbol, Ltp, Chg, and Chg percent columns and a selected row Table component in dark mode: Option Chain grid with depth bars, ATM boundary, and inline row actions; alongside a Watchlist table with header, symbol, last price, change, and change percent columns
  • One grid primitive: sortable header, sticky first column, depth bars inside cells, and inline row actions on hover.
  • Drives the option chain, watchlist, positions, orders, closed positions, market depth, and historical data without a rewrite.
  • Density scales from a 4-column watchlist to a 9-column option chain, so traders learn one interaction and it holds everywhere.

Order panel

Order panel component: 311 by 720 docked side panel shown in two states, Buy Limit and Sell Stop Limit, both for Reliance with bid-ask spread header, Market, Limit, Stop, and Stop Limit tabs, Price, Units, collapsible Exits section for Take profit and Stop loss, Extra settings with Time in force, Order info with margin and leverage, and a full-width Buy or Sell action button Order panel component in dark mode: 311 by 720 docked side panel in Buy Limit and Sell Stop Limit states for Reliance with bid-ask header, order type tabs, Price, Units, Exits, Extra settings, Order info, and a Buy or Sell action button
  • Docked 311 wide panel with Market, Limit, Stop, and Stop Limit order types and collapsible Exits, Extra settings, and Order info sections.
  • Take profit and stop loss are baked into the same shell as the entry, so bracket orders don't need a separate flow.
  • Buy stays green and Sell stays red across the header, the action button, and every downstream toast, so intent is never ambiguous.

Documentation

A build specification, not a description

  • Every component ships with three artifacts next to it: a spec page, a semantics specimen, and the naming map, so engineering builds from the doc instead of interpreting a mock.
  • Each doc is written to the same template, so the next component reads like the last one and no field is quietly skipped.
Component documentation surfaces: Button specification page at center with Usage rules, Anatomy call-outs on Label and Template variants, and a numbered Parts table for Container, Left icon, Label, Right icon, Icon slot, and Size sm; a Semantics Specimen page at left listing surface, text, and action tokens with per-theme values, CSS variables, WCAG contrast, and usage notes; and a Token Naming Framework page at right explaining the family, category, role, and modifier pattern with the seven token families table Component documentation surfaces in dark mode: Button specification page at center, Semantics Specimen page at left, and Token Naming Framework page at right
  • Button Documentation: one of 30. What the block is made of, its settings, and the live matrix of every variation.
  • Semantics Specimen: every colour and size with its value in each theme, its name in design and in code, and a readability score.
  • Token naming framework: the naming rules, how every colour, size, and block gets one name that design and code share.

Patterns

Recurring interactions, one grammar

  • Patterns are the second layer: primitives composed into interactions traders recognize across the terminal.
  • Menu, toolbar, modal, chart, bottom panel, data table, list panel, empty state, each pattern has one canonical implementation.
  • Change the pattern once, every surface that uses it inherits the change. No drift, no per-screen re-litigation.

Menu · Time interval

Menu pattern: time interval selector grouped into Custom, Seconds, and Minutes with inline star favorites, an Add custom interval action at the top, and 5y to 1d preset buttons below Menu pattern in dark mode: time interval selector grouped into Custom, Seconds, and Minutes with inline star favorites, an Add custom interval action at the top, and 5y to 1d preset buttons below
  • Grouped, collapsible categories with inline favorites and an Add custom interval affordance for power users.
  • Same shell powers every menu on the chart: interval, chart type, layout, and any list that needs categories plus search plus favorites.
  • Preset buttons at the bottom let traders jump to common ranges without opening the menu.

Toolbar · Line settings

Toolbar pattern: Lines drawing palette on the left with Trend Line, Ray, Info Line, Extended Line, Trend Angle, Horizontal and Vertical Line, Cross Line, Arrow, Channels, and Pitchforks, plus a floating per-object toolbar with color, width, style, lock, settings, delete, and a Visual order submenu of Bring to front, Send to back, Bring forward, Send backward Toolbar pattern in dark mode: Lines drawing palette on the left, floating per-object toolbar with color, width, style, lock, settings, delete, and a Visual order submenu of Bring to front, Send to back, Bring forward, Send backward
  • Drawing tool palette on the left, per-object floating controls on the chart, and layered context menus for stacked drawings.
  • Style, lock, delete, and visibility all live one click from the object, so traders don't reach for a sidebar mid-analysis.
  • Visual order and interval visibility submenus keep multi-timeframe setups readable without hiding the tool.

Modal · Indicators store

Modal pattern: Indicators store with a full-width search field, Personal, Built-in, and Community category groups on the left rail, and scriptable indicators (My script, Eagle Eye, Phoenix Wave, Quantum Trend, Nebula, Stellar Signal) with monthly INR pricing on the right Modal pattern in dark mode: Indicators store with search, Personal, Built-in, and Community categories, and scriptable indicators with monthly INR pricing
  • Centered modal with a search bar and a two-column layout: sidebar categories on the left, results on the right.
  • Same shell powers indicator discovery, script store, layout picker, and every deep-configuration surface.
  • Category sections (Personal, Built-in, Community) scale from 2 items to hundreds without a redesign.

Chart · Order flow

Chart pattern: Order flow chart type with bid and ask volume printed inside each candle body, Delta and Total labels called out at the bar level, and a bottom summary strip of Volume, Delta, CVD, and POC per 5-minute interval Chart pattern in dark mode: Order flow chart type with bid and ask volume inside each candle, Delta and Total per bar, and a bottom summary strip of Volume, Delta, CVD, and POC
  • Bid and ask volume printed inside each candle body, with Delta and Total called out at the bar level.
  • Bottom strip aggregates Volume, Delta, CVD, and POC per interval, so microstructure reads without switching charts.
  • Dense enough for a professional order-flow trader, legible at a glance for a discretionary one.

Bottom panel · Positions

Bottom panel pattern: Account Manager with Equity, Balance, Today's P&L, Unrealized P&L, and Margin Used stats pinned above tabs for Positions, Orders, Closed Position, Portfolio, Analytics, Margin, and Funds, and a table of open positions (TCS, RELIANCE, HDFC, INFOSYS, TATA) with Product, Net Qty, Buy Avg, Sell Avg, LTP, P&L, and Realized columns Bottom panel pattern in dark mode: Account Manager with equity, balance, and P&L stats, tabs for Positions, Orders, Closed Position, Portfolio, Analytics, Margin, and Funds, and a table of open positions
  • Persistent account summary above tabbed views for Positions, Orders, Closed Position, Portfolio, and margin/funds.
  • Trader-critical stats (Equity, Balance, P&L, Margin) stay pinned above the fold; the table underneath is scrollable and sortable.
  • Same panel appears across every chart layout, so traders check state without leaving the analysis surface.

Data table · Option chain

Data table pattern: Option Chain modal for Reliance with expiry selector, Nifty 50 index price, ATM IV, IV Change percent, PCR, Market Lot, IVR, and IVP header stats, and a two-sided CE and PE grid sharing a centered Strike Price column, with inline Buy, Sell, chart, and save actions on the ATM row Data table pattern in dark mode: Option Chain modal with expiry selector, ATM IV, IV Change percent, PCR, Market Lot, IVR, IVP stats, and a two-sided CE and PE grid sharing a centered Strike Price column
  • Two-sided (CE / PE) grid built around a shared Strike Price spine, with color-coded OI change per row.
  • Symbol search, expiry picker, IV/PCR/IVR/IVP stats, and inline B/S actions on the ATM row: one modal, everything an options trader needs.
  • Same table shell drives Market Depth, Historical Data, and the Strategy Builder without a rewrite.

List panel · Watchlist

List panel pattern: FnO Stocks watchlist on the right rail with Symbol, Ltp, Chg, and Chg percent columns for TCS, RELIANCE, HDFC, INFOSYS, TATA, and WIPRO, and a Reliance Industries detail block below with company chip, last price 333.36, and a Day's Range slider from 5,190 to 5,690 List panel pattern in dark mode: FnO Stocks watchlist on the right rail with symbol, last price, change, and change percent columns, and a Reliance Industries detail block below with last price and Day's Range slider
  • Right-rail list that switches between Watchlist, Alerts, Symbol info, and Layouts without rearranging the chart.
  • Row hover reveals inline actions; a click loads the symbol into the active chart.
  • Detail block at the bottom summarizes the selected row (last price, Day's Range), so traders don't need a second click.

Empty state · No orders

Empty state pattern inside the Account Manager panel: zeroed P&L stats above tabs at zero counts, and a centered No orders yet message with a Place an order primary action Empty state pattern in dark mode: zeroed P&L stats above tabs at zero counts, and a centered No orders yet message with a Place an order primary action
  • Every list and table has a first-run and idle state: short headline, one line of context, one primary action.
  • Copy tells traders what appears here and how it gets there, so nothing feels broken on day one.
  • Same shell handles No orders, No positions, No alerts, and No layouts, so the terminal never dead-ends.

AI Powered Workflow

Iterating with an AI-assisted stack

As the system grew, I put together a small AI-assisted stack for iteration work. Claude holds the DS context and drives edits inside Figma through two MCP servers, with the spec generated on the way out. This clip shows the workflow adding new rows (Volume, Delta, POC, CVD) to the charts master component and (Delta, Total) to the order flow chart.

  • Claude as client: holds context on tokens, components, and naming, and dictates the change from intent to file edits.
  • Figma Console MCP by southleft: reads the Figma file and inspects the console for tokens, components, and errors, so Claude works against real state instead of guessing.
  • Figma MCP: executes the edits inside Figma, keeping me out of repetitive component surgery.
  • uSpec by Uber: auto-generates the component spec the moment the change lands, so engineering picks it up without a handoff meeting.

The DS ships faster when the tools that read it, edit it, and document it can talk to each other.

Adding Volume, Delta, POC, and CVD to the charts master component, and Delta and Total to the order flow chart, all driven from Claude


Design Decision 1

Preserving TradingView muscle memory

  • Where we could match TradingView without a real cost, we did, drawing rail position, toolbar order, shortcuts, crosshair behavior.
  • Where we diverged, we diverged with intent: inline order overlays, tighter density, native Dhan color grammar.
  • Every divergence had to answer "what does the trader get that TradingView can't give them?"

Familiarity is a feature. Traders don't want a "better" chart, they want a chart that respects their instincts and then does more.


Design Decision 2

Light and dark from day one

  • Trader theme preferences split roughly evenly, and switching mid-session is common.
  • Every token, component, and state was designed in both themes in parallel, never "we'll add dark mode later."

White

Dhan Charts terminal in the White theme, light background with green and red candles

Carbon

Dhan Charts terminal in the Carbon theme, near-black background with green and red candles

Royal

Dhan Charts terminal in the Royal theme, deep navy background with green and red candles

Impact

What this changed for the business

  • Business: 2 vendor licenses (TradingView, ChartIQ) now optional, cutting recurring costs as adoption grows.
  • Efficiency: 225 icons and 62 reusable components ship as 1 Figma library.
  • Consistency: 1 Table powers 4 dense surfaces, 1 Menu powers every dropdown, 100% light/dark parity from day one.
  • Risk: 0 forced migrations. Traders keep TradingView or ChartIQ via a switcher.
  • Handoff: 1 versioned Figma library the Charts Pod consumes directly, with playgrounds for every prop.

Learnings

What I Learned

  • A charts DS isn't a token library, it's a stack. Tokens, primitives, chart-specific components, and interaction patterns each have different owners and failure modes.
  • Familiarity is a feature. The design work is knowing where to hold the line and where to push.
  • Owning the surface changes what you can ship. Inline order flow and Dhan-specific overlays become natural once the chart is yours.

In Progress

Connecting design to code

  • The design file is the single source: colours, sizes, and block specifications export straight into the code repository, and an automatic check flags any code that ignores the system.
  • Still working out engineering adoption: the release process, the automatic gate, and the number that proves the system is actually being used.