| Nothing renders, no error |
container has zero height |
inspect the element's computed height |
Nothing renders after setData |
data is empty, or times are not numbers |
log series.getData().length and the first item |
| Bars bunched at the far left or right |
time is in milliseconds |
a value above 1e12 is milliseconds |
| Bars overlap or a candle draws twice |
two bars share a time |
times must be unique and ascending per series |
| Axis and crosshair show the wrong hours |
the chart is on its default zone, Asia/Kolkata |
chart.timezone(); set timezone or call setTimezone |
| VWAP restarts mid-afternoon, or a pivot frame spans two sessions |
the chart's zone is not the instrument's |
chart.timezone(); a timeFormatter relabels but does not move the calendar |
unknown series type "kagi" |
transform tier not imported |
rg "openalgo-charts/transform" |
addIndicator throws |
indicators tier not imported |
rg "openalgo-charts/indicators" |
| A tier is imported but its feature is missing |
deep import created a second registry |
check for any path containing /dist/ or /src/ in an import |
| Indicator plots misaligned with price |
indicator on a different data set, or bar times differ |
compare the first and last bar times |
| Series fills or is squashed into part of the pane |
price-scale margins |
margins are fractions of pane height, not data span |
| A volume overlay swallows the price series |
overlay scale margins |
priceScaleId: '' plus marginTop |
| Drawings drift after zoom or a session gap |
anchors stored in pixels |
anchors must be { time, price } |
| A drawing shortcut does nothing |
the library installs no key listener |
the host must call matchDrawingShortcut |
| Chart does not resize |
no ResizeObserver, or container is not measurable |
call chart.applySize(w, h) manually |
| Custom primitive is blurry or offset |
media px not multiplied by dpr |
inspect the draw implementation |
| Live ticks never appear |
subscription filter, or the builder was never seeded |
log inside the tick handler before the builder |
| Live candle duplicates the last history bar |
builder started unseeded |
pass seedFrom: lastHistoryBar |
| Chart snaps to the right edge on every update |
setData called per tick |
use series.update(bar) |
| Viewport jumps when older history loads |
re-fitting after prepend |
prependData preserves the window; do not fitContent |
| A linked crosshair marks the wrong bar |
a logical index was copied between charts |
it lines up only while both charts hold identical bars; the sync must convert index to time and back |
| Linked charts show different periods after a pan |
the same index copy, on the viewport |
use the group, or followerRange, never setVisibleLogicalRange(other.getVisibleLogicalRange()) |
| A linked chart shows no crosshair at all |
the instant is outside its coverage, or whenMissing: 'hide' |
group.crosshairIndex(chart) returns null; an instant past its first/last bar is refused by design |
| Symbol sync changes nothing |
no onSymbol on the member, or the host never reports the change |
the engine has no instrument concept; check both halves |
| The last price is stale after switching symbols and back |
a cache serving the forming bar |
withBarCache never stores it; a hand-rolled cache usually does |
| Every load is cold out of hours |
to is "now", past the entry's coverage |
cap to at the newest bar the session table says can exist |
UnknownIntervalError at subscribe time |
the interval code is not built in and was never registered |
it is the intended behaviour, not a regression; registerInterval or fix the code |
| A monthly chart buckets into minutes |
intervalToSeconds on a calendar code |
it throws now; use resolveInterval + bucketStartOf |
| A cut deleted nothing, or copied "into the void" |
the async result was not awaited |
await draw.cut() and check the boolean; read draw.clipboard().lastError() |
| Orders do not reach the broker |
wrong layer |
chart.trading is visualization only |
| Blank page in Next.js or SSR |
chart created during server render |
client-only component, create in an effect |
| Bare specifier fails in the browser |
no bundler resolution |
standalone build or an import map |