Release notes
The full, authoritative changelog lives in
CHANGELOG.md.
1.0.10
Added — Market Profile
- Controllable TPO / footprint row height. Row height is now
tickSize * rowTicksinstead of being pinned to the instrument tick. The multiplier is the one a trader already thinks in: Nifty trades in 0.1 and you want 2-point rows, sorowTicksis2 / 0.1 = 20(rowTicksFor(2, 0.1)does the division). Keeping the two separate matters — the tick is what imbalance and single-print logic count on, so widening rows must not mean lying about it. The same multiplier reaches order flow:computeFootprint(t, trades, 0.1, 20)andnew FootprintAggregator(tf, 0.1, 20). See Market Profile. - Letters degrade to bricks automatically. A TPO row is only as tall as the
price scale makes it, so at some zoom a letter stops fitting.
blockDisplay: 'auto'(the new default) crossfades: the block is always drawn and the letter fades in overletterFadepx aboveminLetterHeight, so zooming through the threshold reads as one continuous change instead of a jump. The footprint fades its cell numbers the same way viatextFade. - Analytics — per-period detail, the developing POC / value-area track, day
type, open type, range extension, buying / selling tails, volume POC, and
nakedLevels()for prior POC / VAH / VAL no later session traded through. - Session windows —
windowdrops bars outside a trading session and anchors periodAto the window’s open. Built-ins inTRADING_HOURS:all-hours,india,asia,london,new-york,us-regular.compositeSessionsmerges N sessions into a rolling composite. - Renderer options —
colorModegainsperiod(one hue per TPO period, now the default); plussplitperiod columns,showTpoCounts,showTails,showPoorHighLow,showNakedLevels,showDevelopingPoc/showDevelopingVa,showDayType/showOpenType,volumeProfileSide,showVolumeValues, andhitTest/hoverAtfor a host-drawn tooltip.
Added — Interaction
- Time navigator — hover-revealed zoom / step controls just above the time
axis:
-+to zoom,‹›to step one bar. Invisible until the pointer nears the bottom of the chart, then faded in. The buttons run the same commands the keyboard does, so the two cannot drift apart, and each tooltip reads its combo from the live keymap. On by default;timeNavigator: falsedrops it. See Interactions. - New commands
panLeftBar/panRightBar(one bar, unbound by default), and a publicpane.primitives()accessor.
Fixed
- The docs Market Profile example rendered a histogram, not a market profile.
It used
computeTpo+HorizontalProfile— a volume-profile-shaped bar chart with no letters — even though the letter renderer already existed. - Periods anchored to the first bar rather than the session open, so a session whose first bar arrived late shifted every letter.
Breaking
MarketProfile’sshowLettersboolean is replaced byblockDisplay(showLetters: falsebecomesblockDisplay: 'blocks').
1.0.9
Added — Order flow
- Footprint rewritten. Cells fill proportionally to volume instead of being
outlined, so a column reads as a heat ladder; imbalanced cells fill saturated
rather than gaining a border, and runs of consecutive same-side imbalances get
a bracket. New
displayMode(bidask/delta/volume), a per-barstatsRowstable (volume / delta / delta % / CVD / trades) tinted by strength, plusstackedImbalances,showPoc,showCandle,widthFactor,radiusandminTextHeight.setOptions()restyles live;hitTest()/hoverAt()map a pointer back to the bar and price row. See Profiles & Order Flow. - Live order-flow example — synthetic classified ticks stream into a
FootprintAggregatorwith the forming bar updating in place, the same path a live WebSocket trade feed takes.
Added — Drawing
- Shape text —
DrawingStylegainsfontColor,textVAlignandtextPosition; rectangles, ellipses and parallel channels render astyle.textlabel. One shape, two colours:colorstrokes the outline,fontColorpaints the label. See Drawing Tools.
Fixed
- Drawing a rectangle by dragging placed nothing and scrolled the chart.
Press-drag-release is how every charting UI lays down a two-point shape, but
the chart only emitted a
clickwhen the pointer had not moved, so the gesture produced no anchors while the pan path consumed it. Newchart.setPlacementMode(active): a press no longer pans, and the gesture is reported as twoclickevents, the release taggedviaDrag. Every two-point tool gained drag-to-draw with no API change; single-anchor tools ignore the release half. - The price axis produced about half the tick labels it was asked for.
niceTicksrounded the span up to a nice number and then divided, rounding twice — a 10.5-point range became 20, giving three labels where six were requested. The step now comes from the raw span, clamped up the 1 / 2 / 2.5 / 5 / 10 ladder until it fits.
Changed
Footprint.hoverAt(x, y, rc?)—rcis optional and defaults to the last paint’s context, so a crosshair handler can just callhoverAt(p.x, p.y).- Docs demos follow the site theme (the library default is the light palette, so every example had been rendering a white panel into a dark page).
1.0.8
Added — Indicators
- 18 built-in indicators in the new lazy
openalgo-charts/indicatorstier (4.5 KB Brotli): SMA, EMA, WMA, VWAP, Bollinger Bands, Supertrend, Parabolic SAR, Ichimoku Cloud, RSI, MACD, Stochastic, ADX/DMI, CCI, MFI, ATR, Volume, OBV, and A/D. See Indicators. - An indicator registry — the sibling of the chart-type registry. A
descriptor is data, and each plot names a registered chart type, so indicators
ride the existing renderers and add no drawing code.
chart.addIndicator(),chart.indicators(),chart.removeIndicator(). - A Tier-2 contract (
createTier2Indicator) for indicators whose data is not derived from the chart’s OHLCV — open interest, CVD, any external feed.
Added — Panes & legends
- Pane legends with per-plot readings in each plot’s colour, tracking the
crosshair, and inline controls revealed on hover: show/hide, settings, move
pane, maximize, delete.
PaneLegendis public, so a host can add its own rows (a symbol/OHLC header) and indicator rows stack beneath. - Draggable pane dividers plus
setPaneWeight,movePane,maximizePane, andremovePane. See Scales & Panes.
Added — State
chart.getState()/chart.restoreState()for saved layouts, with an opaquedrawingsslot. See Chart State.
Fixed — Packaging
- Lazy tiers could not register into the base bundle’s registries: each tier
inlined its own private copy, so
import 'openalgo-charts/transform'followed byaddSeries('point-figure')threw even though the tier was loaded. Tiers now import the package entry, which is external for tier builds.
Fixed — Interaction
- A
setPointerCapturethrow (Chrome raisesNotFoundErrorfor an inactive pointer id) aborted the rest ofpointerdown, silently losing the pane-divider grab, the axis-drag arm, and the order-line drag arm. - Pane hit-testing could be offset from what was drawn: panes were laid out with a flex ratio while their canvases were sized from the chart’s own height, so any drift between the two shifted every hit-test off the pixels.
Fixed — Point & Figure
- No more phantom first column. When the first move after the anchor bar was
down, the direction was still
0, so the reversal branch fired while the column’s top and bottom boxes were equal — emitting a zero-height column that drew as a blank slot at the start of every down-opening chart. - Columns are built from the bar range, not just the close. The new
methodoption defaults to'hl': a bar’s high extends an X column and its low extends an O column. A bar that swung through several boxes intrabar but closed flat used to produce no boxes at all.method: 'close'restores the previous behaviour. - The renderer walks integer box indices instead of accumulating
level += boxSize— thirty steps of0.05land on101.49999999999991, which duplicated the top glyph of tall columns. Off-screen glyph rows are now culled.
Added — Point & Figure
- Box-size modes:
mode: 'fixed' | 'percent' | 'atr', the latter two re-resolved each time a column opens so the grid tracks price level and volatility. PointFigureColumncarriesboxSizeandboxes, and the renderer reads the box size from the column — sostyle: { boxSize }is no longer needed, and the transform and style can no longer disagree. See Transforms → Point & Figure.
1.0.7
Fixed
- A right-click on the chart no longer replays the previous left-click. Only the
primary button starts a gesture, so a right-click’s
pointerdownis ignored — but the matchingpointerupwas unguarded and fell through to the click path, re-hit-testing at the stale position from the last left-click and re-firingsubscribeClick. WithBuySellButtonsthat meant the first right-click after buying/selling silently placed a second, duplicate order.pointerupnow applies the same primary-button guard aspointerdown(touch/pen unaffected; the missed-pointerupdrag recovery is preserved).
1.0.6
Added
BuySellButtons— an inline, TradingView-style trade panel drawn on the chart (SELL· qty ·BUY, docked to a corner and fixed while the chart moves). Clicks hit-test to${id}:sell/${id}:buy/${id}:qty(routed throughchart.subscribeClick);setPrices/setMarkupdate prices per tick,setQty/setColorsrestyle at runtime. Add withchart.addPrimitive(new BuySellButtons({ ... })).
1.0.5
Fixed
- Native right-click “Save image as…” now saves the visible chart (the clicked
pane) instead of a blank overlay layer — the pane is composited into the
captured canvas just before the menu opens, and overlay repaints pause while
it is open.
downloadScreenshot()remains the full multi-pane export.
1.0.4
Trading-UI beautification — the order-placement surfaces get a modern, theme-aware visual pass plus real interaction feedback.
Added
- Hover / dragging states for interactive price lines (thicker line, brighter
pill, solid cancel button, soft drag halo) and chart-applied cursor hints
(
ns-resizeover draggable lines,pointerover cancel and ladder rows). - New
hoverevent:chart.on('hover', ({ id }) => ...)fires on primitive enter/leave. - Drag ghost:
PriceLine.setDragGhost(price | null)draws a dimmed reference line at the pre-drag price while modifying (automatic viachart.trading). - Broker-style segmented pill groups on order and position lines —
[badge][qty][label][✕]with newbadge/qtyprice-line options and auto-contrast text; bracket chips with prices (SL 2,850.00) and theme-derived risk/reward zones; fill progress (3/10) and dimmed pending state on working-order lines; fully theme-aware DOM ladder with a hovered-row outline. PrimitiveRenderContext.hoverId/dragIdfor custom primitives.- Real-time order updates:
OpenAlgoWsFeed.subscribeOrders()/onOrderUpdate()(OpenAlgosubscribe_ordersstream) with reconnect replay;mapOrderStatus. chart.downloadScreenshot(filename?)— PNG export of the full composited chart.
Fixed
- Right-click no longer leaves the chart “sticky-dragging”; missed
pointerupis recovered on the next move. - Crosshair hidden while dragging an order line (no phantom line at the grab point).
- Last-price line draws beneath order/position pills instead of striking through.
1.0.3
Cosmetic parity — the last visual gaps for a lightweight-charts migration.
Added
- Per-series
priceLineVisible/lastValueVisible(toggle the last-price line and axis tag) andtitle. The last-price line/tag now follows the main (first right-scale) series. - Crosshair styling in the theme:
crosshairStyle,crosshairWidth,crosshairLabelBackground,crosshairLabelVisible. timeFormattergets an optionaltickMarkTypeboundary hint for adaptive axis labels; new exported typeTickMarkType.
1.0.2
Drop-in parity work so an app can back all its charts with this engine.
Added
- Left / right / overlay price scales.
addSeries(type, { priceScaleId: 'right' | 'left' | '' }).'left'and'right'draw independent, independently-autoscaled axes;''is a hidden overlay scale (volume-in-price-pane).series.priceScale()returns the scale (.setOptions({ marginTop, marginBottom })pins a volume histogram to the bottom). - Mutable series.
series.applyOptions(partialStyle),series.remove(), andstyle.visible— restyle, hide (also drops from autoscale), and remove at runtime. timeScale.setVisibleLogicalRange()/getVisibleLogicalRange()andchart.fitContent()— preserve the user’s zoom across a full-history reload.- Per-series
priceFormat(price/volume/custom), applied to that series’ scale;compactVolumehelper (1.2K / 3.4M / 5.6B). - Dashed / dotted line series via
style.lineStyle. - Runtime
chart.applyOptions()/chart.setTheme()— swap theme, grid, and formatters without recreating the chart. New theme fieldsaxisFontSize,gridStyle, and transparentbackground.
Fixed
RenderLoopno longer skips frames after the first when driven by a synchronous scheduler.
Quality
- 314 unit tests (40 files); base engine ~24.7 KB Brotli.
1.0.1
Full package ~38 KB Brotli (all tiers), base engine ~24 KB, zero runtime dependencies.
Added
- Unified event bus:
chart.on/off/once(crosshair:move,click,pan,zoom,resize,lazy-load,ready), withtrading:*mirrored through it. - Data-driven trading visualization (
chart.trading): position/order pills, TP/SL brackets, and fill markers (chevron / bubble / count). - Custom
priceFormatterandtimeFormatter(with runtime setters); per-panepriceScaleoptions; the time axis is no longer IST-only. setDataacceptsBar | LinePoint | Whitespace(normalized viatoBar);series.getData()reads the current bars.- WebSocket auto-reconnect (backoff + re-auth + resubscribe);
OpenAlgoLiveDataFeedbareD/Wintervals, day-delta volume, and symbol+exchange tick filtering. - Docs: an interactive example gallery (chart type, themes, tooltips, event markers, live streaming) plus framework-integration, mobile, data-loading, events, types, constants, and glossary pages.
Fixed
- Multi-series
DataLayer.updatetime-axis ordering; the package now shipsNOTICE; the accessible summary refreshes on live updates;visibleBarsuses binary search.
Quality
- 297 unit tests (39 files) + the Playwright smoke suite; CI adds a docs-site build and a
NOTICEpack check.
1.0.0
First public release. Full package ~30 KB Brotli (all tiers), zero runtime dependencies, Apache-2.0.
Added
- Indicators: RSI, ATR, Supertrend (Wilder semantics, matching
openalgo.ta), alongside EMA. - Sub-minute (second) and tick/volume timeframes are first-class: the time axis and crosshair show HH:MM:SS automatically on sub-minute bars.
- Interaction: vertical price pan,
resetScale()+ double-click/Fit,priceToCoordinate/coordinateToPrice, andsubscribeCrosshairMovefor OHLC legends/tooltips. - Touch: pinch-to-zoom and two-finger pan. Accessibility: focusable container with
role/aria-label, a polite live summary, and keyboard navigation. takeScreenshot()(composites all panes/layers) and runtime grid toggles.- Footprint primitive: volume-graded bid×ask cells, diagonal-imbalance boxes, POC marker, per-bar delta/volume footer.
- Live feed: composed REST + WebSocket + candle-builder data feed speaking the documented OpenAlgo protocol, with connection/control callbacks.
Quality
- 286 unit tests + a Playwright real-browser smoke suite; GitHub Actions CI runs typecheck, unit, build, size budgets, and the E2E smoke on every push/PR.
0.1.0
First end-to-end build of the engine - dependency-free, full package ~22 KB Brotli.
- Single-canvas render loop with per-pane invalidation; shared gapless time scale; linear price scale with autoscale and tick formatting.
- All standard chart types; live candle builder; markers, event badges, price lines; EMA.
- Transform tier (Heikin Ashi, Renko, Range, Line Break, Point & Figure, Kagi).
- Trade tier (order/position/bracket primitives, order state machine + validation, OCO, depth-of-market ladder).
- Profile tier (Volume Profile, Market Profile / TPO, Footprint, order flow).