DocumentationRelease Notes

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 * rowTicks instead 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, so rowTicks is 2 / 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) and new 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 over letterFade px above minLetterHeight, so zooming through the threshold reads as one continuous change instead of a jump. The footprint fades its cell numbers the same way via textFade.
  • 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 windowswindow drops bars outside a trading session and anchors period A to the window’s open. Built-ins in TRADING_HOURS: all-hours, india, asia, london, new-york, us-regular. compositeSessions merges N sessions into a rolling composite.
  • Renderer optionscolorMode gains period (one hue per TPO period, now the default); plus split period columns, showTpoCounts, showTails, showPoorHighLow, showNakedLevels, showDevelopingPoc / showDevelopingVa, showDayType / showOpenType, volumeProfileSide, showVolumeValues, and hitTest / hoverAt for 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: false drops it. See Interactions.
  • New commands panLeftBar / panRightBar (one bar, unbound by default), and a public pane.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’s showLetters boolean is replaced by blockDisplay (showLetters: false becomes blockDisplay: '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-bar statsRows table (volume / delta / delta % / CVD / trades) tinted by strength, plus stackedImbalances, showPoc, showCandle, widthFactor, radius and minTextHeight. 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 FootprintAggregator with the forming bar updating in place, the same path a live WebSocket trade feed takes.

Added — Drawing

  • Shape textDrawingStyle gains fontColor, textVAlign and textPosition; rectangles, ellipses and parallel channels render a style.text label. One shape, two colours: color strokes the outline, fontColor paints 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 click when the pointer had not moved, so the gesture produced no anchors while the pan path consumed it. New chart.setPlacementMode(active): a press no longer pans, and the gesture is reported as two click events, the release tagged viaDrag. 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. niceTicks rounded 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?)rc is optional and defaults to the last paint’s context, so a crosshair handler can just call hoverAt(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/indicators tier (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. PaneLegend is 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, and removePane. See Scales & Panes.

Added — State

  • chart.getState() / chart.restoreState() for saved layouts, with an opaque drawings slot. 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 by addSeries('point-figure') threw even though the tier was loaded. Tiers now import the package entry, which is external for tier builds.

Fixed — Interaction

  • A setPointerCapture throw (Chrome raises NotFoundError for an inactive pointer id) aborted the rest of pointerdown, 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 method option 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 of 0.05 land on 101.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.
  • PointFigureColumn carries boxSize and boxes, and the renderer reads the box size from the column — so style: { 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 pointerdown is ignored — but the matching pointerup was unguarded and fell through to the click path, re-hit-testing at the stale position from the last left-click and re-firing subscribeClick. With BuySellButtons that meant the first right-click after buying/selling silently placed a second, duplicate order. pointerup now applies the same primary-button guard as pointerdown (touch/pen unaffected; the missed-pointerup drag 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 through chart.subscribeClick); setPrices / setMark update prices per tick, setQty / setColors restyle at runtime. Add with chart.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-resize over draggable lines, pointer over cancel and ladder rows).
  • New hover event: 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 via chart.trading).
  • Broker-style segmented pill groups on order and position lines — [badge][qty][label][✕] with new badge / qty price-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 / dragId for custom primitives.
  • Real-time order updates: OpenAlgoWsFeed.subscribeOrders() / onOrderUpdate() (OpenAlgo subscribe_orders stream) 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 pointerup is 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) and title. The last-price line/tag now follows the main (first right-scale) series.
  • Crosshair styling in the theme: crosshairStyle, crosshairWidth, crosshairLabelBackground, crosshairLabelVisible.
  • timeFormatter gets an optional tickMarkType boundary hint for adaptive axis labels; new exported type TickMarkType.

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(), and style.visible — restyle, hide (also drops from autoscale), and remove at runtime.
  • timeScale.setVisibleLogicalRange() / getVisibleLogicalRange() and chart.fitContent() — preserve the user’s zoom across a full-history reload.
  • Per-series priceFormat (price / volume / custom), applied to that series’ scale; compactVolume helper (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 fields axisFontSize, gridStyle, and transparent background.

Fixed

  • RenderLoop no 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), with trading:* mirrored through it.
  • Data-driven trading visualization (chart.trading): position/order pills, TP/SL brackets, and fill markers (chevron / bubble / count).
  • Custom priceFormatter and timeFormatter (with runtime setters); per-pane priceScale options; the time axis is no longer IST-only.
  • setData accepts Bar | LinePoint | Whitespace (normalized via toBar); series.getData() reads the current bars.
  • WebSocket auto-reconnect (backoff + re-auth + resubscribe); OpenAlgoLiveDataFeed bare D/W intervals, 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.update time-axis ordering; the package now ships NOTICE; the accessible summary refreshes on live updates; visibleBars uses binary search.

Quality

  • 297 unit tests (39 files) + the Playwright smoke suite; CI adds a docs-site build and a NOTICE pack 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, and subscribeCrosshairMove for 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).