SPX-0.93%
NDX-1.26%
SPY-0.93%
QQQ-1.27%
DJI
VIX
2026-07-17 · 15:55 ET

Changelog

v1.19.02026-07-16
Added
  • Score trend sparkline on /groups/[id] — plots the group's last ~20 recorded composite scores next to the Score value, so trajectory (improving vs. worsening) is visible at a glance instead of requiring two static snapshots to compare.
  • Peer rank badges on /groups/[id] — Rank (1D), Rank (5D), Rank (1M), and Rank (3M), each showing the group's position among all groups (e.g. "4 / 33"), colored by quartile. Anchors the composite score against its peers instead of showing it in isolation.
  • ETF candlestick chart on /groups/[id] — reuses the existing symbol-detail price chart (MA20/MA50, volume pane, range selector) for the group's ETF, giving price/trend context that was previously only available on individual symbol pages.
  • Leader breadth row on /groups/[id] member table — shows positive/total leaders per RS timeframe (Day/5D/1M/3M/6M/1Y), colored by majority, so dispersion across the group's leaders is visible without reading every row.
Changed
  • Group member table now stretches full width (w-full) to match the width of the new ETF price chart above it.
v1.18.02026-07-16
Added
  • Gap % fallback for ETF-less themes on /premarket. Themes with no ETF (e.g. China Electric Vehicles, Restaurants US, Natural Gas, AI Infrastructure) now show a Gap % averaged from their leader stocks' premarket returns, tagged with an "avg" indicator and tooltip, instead of a blank dash.
v1.17.02026-07-12
Added
  • Verdict signal chip row on /symbols/[symbol] — rules-based state chips (UPTREND/DOWNTREND/RANGE, RS LEADER/RS LAGGARD, RS IMPROVING/RS FADING, EXTENDED, NEAR 52W HIGH/NEW 52W HIGH, RSI STACKED) with hover explanations, consolidated into one row under the company name alongside the volume signal and earnings countdown badges.
  • Analyst Opinion card in Fundamentals — consensus rating and buy/hold/sell breakdown, mean/high/low/median price target with upside vs. current price, and a table of recent analyst upgrades/downgrades. Sourced from yfinance and refreshed on the existing fundamentals cycle; fills the former "Analyst Opinion" placeholder.
  • Arrow-key navigation in the side panel. With a symbol panel open, ArrowLeft/ArrowRight step to the previous/next symbol in whichever table the panel was opened from (Leaders, Technical, Volume, Group Members, etc.).
Changed
  • Chart mouse-wheel zoom now requires Ctrl/Cmd+scroll. Plain scroll over the price chart scrolls the page instead of zooming the chart.
  • Price/metrics block left-aligns instead of right-aligning when the symbol detail is shown in the side panel, so it no longer overflows the narrower width.
Fixed
  • Signal and volume tooltips no longer render off-screen. They now flip below their trigger when there isn't room above (e.g. near the top of the viewport), and render through a portal so the side panel's slide-in animation no longer displaces them past the right edge of the window.
v1.16.02026-07-12
Added
  • RS trend, relative-volume, and RSI sparklines on /symbols/[symbol] — 30-day cumulative RS vs SPY and RSI trend, plus a 20-day relative-volume trend, surfaced in the header and Technical Summary so direction (not just level) is visible at a glance.
  • Percentile ranks on the returns grid. Each 5D/1M/3M/6M/YTD/1Y tile now shows a "Top X%" or "Bottom X%" sub-label ranking the symbol's raw return against all leader symbols at the latest as_of.
  • Group Context section on /symbols/[symbol] — group name, overall group rank (e.g. "#10/33"), and a 5-row mini-leaderboard of sibling leaders (1M relative return, rel vol) with the current symbol highlighted.
  • MA20/MA50/MA200 overlays on the price chart, each independently toggleable (MA200 defaults off). Computed from the full retained candle history so lines stay stable across zoom ranges.
  • Volume pane on the price chart — a colored up/down histogram in its own pane below the candles.
  • Earnings markers on the price chart — small "E" badges on past earnings dates, colored green (beat) or red (miss), anchored to a fixed baseline at the bottom of the volume pane.
  • Earnings countdown badge in the /symbols/[symbol] header, shown when the next earnings date is within 30 days; switches to warning color under 10 days. The same badge/threshold is now also shown next to the earnings date in Fundamentals.
  • Earnings track record and last reaction in Fundamentals — "Beat X of 8 · avg surprise Y%" and the stock's close-to-close return the session after its most recent earnings report.
Changed
  • Company description hidden by default on /symbols/[symbol], behind an "About Company" toggle placed next to the company name (previously a 2-line clamp shown by default) — saves vertical space.
  • Chart pane divider color darkened to match the existing border token (was using the charting library's default light gray).
Removed
  • Per-symbol Fundamentals "Refresh" button and its API route — decided not worth the added surface; fundamentals still refresh on the regular engine schedule.
  • "as of <date>" timestamp removed from the Fundamentals Valuation header.
v1.15.02026-07-10
Added
  • Daily candlestick price chart on `/symbols/[symbol]`. Uses lightweight-charts (TradingView's own charting library) against the existing candles table — daily bars only for now, spanning the full ~1 year of retained history. Includes a range selector (1Y / 6M / 3M / 1M / 1W / 1D), a fixed right-side margin so the latest candle never sits flush against the price labels, and zoom/pan clamped to the actual data bounds.
v1.14.02026-07-10
Added
  • Symbol detail opens in a side panel. Clicking a symbol from Leaders, Technical, Volume, or Group Members now opens the symbol detail view in a right-side panel instead of navigating away, reusing the same data-fetching and content as the dedicated /symbols/[symbol] page. Direct navigation, refresh, and new tabs still render the full page. The panel offers an "Open full page" link, and closing returns to the page you started from.
  • Fintel and Stocktwits shortcuts added to the shortcuts bar on /symbols/[symbol], alongside TradingView.
  • Volume signal badge surfaced immediately in the page header (next to Price / Today / Vs SPY) on /symbols/[symbol] when a signal (e.g. "Bullish Breakout") is active, instead of requiring a scroll to a dedicated section.
Changed
  • Company description clamps to 2 lines (previously 3) before "Read more" on /symbols/[symbol].
Removed
  • "Group Context" and "Recent Alerts" sections removed from /symbols/[symbol]. Group membership is still shown as a badge in the page header; alerts will be reworked in a future pass.
  • Dedicated "Volume Signal" section removed from /symbols/[symbol] — replaced by the header badge above.
v1.13.02026-07-10
Added
  • YTD return on symbol detail page. Calendar year-to-date return (vs. SPY) now shown alongside 5D/1M/3M/6M/1Y in the Performance And Volume section on /symbols/[symbol]. Stored as a separate ytd timeframe in computed_returns so it does not feed group scoring or rankings.
v1.12.02026-06-17
Changed
  • Column and title renames. "Today %" / "Today RS" shortened to "Day %" / "Day RS" across /technical, /sectors, /volume, /leaders, and /groups/[id]. "Sector Rotation Matrix" shortened to "Sector Rotation". "Volume Spikes" shortened to "Volume".
  • Removed the `#` rank column from /sectors, /volume, /leaders, and /premarket — redundant with sortable columns.
  • Premarket column moved next to Price on /technical (previously the last column).
  • Glossary button is now icon-only (the "Glossary" text label was dropped) on all four pages that use it.
Improved
  • Frozen first column and table header on scroll for /technical, /volume, /leaders, and /sectors — the symbol/group column and column headers now stay pinned while scrolling through long tables, both vertically and horizontally.
  • Company name hidden on mobile next to ticker symbols on /technical, /volume, and /leaders to reduce row width on small screens.
  • Mobile filter layout on `/technical` no longer overflows the viewport — filters stack below the title and share width evenly.
  • Signal filter buttons on `/volume` use tighter padding on mobile.
Fixed
  • Sticky header transparency. Column headers no longer show row content "ghosting" through them while scrolling — SortableHeader now has a solid background.
  • Sort arrow wrapping. The ▲/▼ sort indicator no longer wraps onto its own line under the column label.
  • RS trend arrow wrapping on /sectors no longer drops to a new line under the percentage value.
v1.11.22026-06-08
Fixed
  • Group drill-down Today % / Today RS blank during premarket. getGroupDetail now checks whether intraday computed_returns exist for today before using the intraday join. If they don't (premarket, weekends, or before the intraday job runs), it falls back to the latest 1d values so the columns are never blank.
v1.11.12026-06-08
Fixed
  • Leaders table empty when intraday data is present. getLeaderRankings was deriving as_of from group_scores (a daily date) even when called with timeframe="intraday", so the query found zero rows. It now derives as_of from computed_returns when the intraday timeframe is requested.
  • Premarket column on `/technical` not sortable. The column header was a static <th>; replaced with <SortableHeader>.
v1.11.02026-06-08
Added
  • PM % column on group drill-down (`/groups/[id]`). Shows each member's premarket return vs the previous close, populated from today's premarket data.
Improved
  • PM Vol hidden when unavailable. The PM Vol column on /premarket is now hidden when yfinance returns no volume data for extended-hours bars, rather than showing a column of dashes.
  • Quieter update logs. Per-symbol OK lines removed from update_daily. yfinance "possibly delisted" spam suppressed. Failed symbols are now collected and printed as a single summary line (e.g. missing: AAPL CRM CMG) so rate-limit drops remain visible without flooding the log.
  • Clear button on `/logs`. Truncates the log file in place. Two-step confirm (first click → "Sure?", second click → clears) to prevent accidental deletion.
v1.10.12026-06-08
Improved
  • Top bar cleanup. Removed the "AS OF" date label from the middle of the bar. Last data timestamp (date + time ET) now appears next to the Refresh button, always visible and always showing hours and minutes — falling back to the latest daily candle time when no intraday data is available.
  • Webhooks table. Added a Current Price column after Threshold, populated on page load from the snapshot API for each symbol. Shows - for volume metric rules.
v1.10.02026-06-08
Changed
  • Alerts panel reworked. The bell icon now shows webhook-fired notifications instead of the old auto-generated signal-change and volume-spike alerts. Alerts are written to the database each time a webhook rule fires, using the same message sent to Discord. Old alerts are cleared on first load via an automatic schema migration.
Added
  • Mark alerts as read. Each alert in the panel has a checkmark button to dismiss it individually. A "Mark all read" button clears the badge in one click. Read alerts dim to 40% opacity and remain visible for reference. Badge count shows unread alerts only.
Removed
  • Daily signal-change and volume-spike alert generation (generate_alerts job removed from the update pipeline).
v1.9.12026-06-08
Added
  • Logs page (`/logs`). Displays the last 300 lines of the run_update.py cron output. Auto-refreshes every 30 seconds with a live countdown. Section headers, errors, webhook fires, and skipped rules are colour-coded for quick scanning. Accessible under Admin in the sidebar.
v1.9.02026-06-08
Added
  • Webhook Alerts page (`/webhooks`). Configure per-ticker alert rules that POST to a Discord channel when a market condition is met. Supports three metrics: Price (crossing up/down/either), Relative Volume (exceeds threshold), and Pre-market Relative Volume (exceeds threshold). Each rule has a trigger mode (Every Time or Once Only) and an optional note appended to the Discord message.
  • Discord webhook settings panel (Settings → Webhooks). Global Discord webhook URL with a test button that sends a sample message to verify the integration.
  • Symbol snapshot strip in the rule modal. Selecting a ticker shows a compact stat bar with the current price and 1D / 5D / 1M / 3M / 6M / 1Y return percentages, colour-coded positive/negative.
  • Auto-fill price threshold. The Price Threshold field is automatically populated with the latest known price whenever the symbol or metric changes; switching to a volume metric clears the field instead.
  • `fire_webhooks` Python job. Evaluates all enabled rules on every run_update.py cycle. First run establishes a baseline; crossing is detected on subsequent cycles. Once-Only rules self-disable after firing.
v1.8.12026-06-08
Added
  • Pre-Market Radar page (`/premarket`). New dedicated pre-open scan showing all sectors and themes ranked by their ETF gap vs SPY. Columns: Gap %, vs SPY, PM Rel Vol (premarket volume vs historical premarket average), 5D RS, 1M RS, 3M RS. Gap data populates 04:00–09:30 ET; RS columns always show the latest daily values.
Changed
  • Premarket nav item is now a live link (previously disabled). Sidebar no longer gates it behind the display preference toggle; the premarket toggle in Settings → Display remains for the Technical page column only.
v1.8.02026-06-07
Added
  • Premarket data job. New update_premarket job fetches 5-minute candles via yfinance (prepost=True), filters to the 04:00–09:29 ET window, stores them in candles with is_extended_hours=1, and writes premarket returns for all symbols into computed_returns (timeframe premarket). Runs automatically as part of the daily update pipeline.
  • Premarket % column on Technical page. The Premarket column (Settings → Display) is now fully enabled and shows each leader's pre-market return vs the previous close, colour-coded green/red. No premium API required — powered by the new premarket job.
  • Market session badge in the top bar. The bar now shows context-aware session state: a sun icon + PRE (amber) during pre-market hours, the existing green pulsing dot + LIVE during regular trading, and a moon icon + AFT (blue) during after-hours. Nothing is shown when the market is closed.
v1.7.32026-06-03
Fixed
  • New group members deleted on first refresh. Symbols added via Settings were being pruned as "delisted" on the next global refresh because they had no candle history yet. The prune job now skips any symbol actively referenced as a leader or ETF in group_members.
v1.7.22026-06-02
Fixed
  • Fundamentals chart tooltip labels. Revenue and Margins tooltips now show the series name alongside the value (e.g. "Revenue : $3.06B") instead of a bare number.
  • Dynamic B/M units on financial charts. Revenue and Cash Flow charts now display values in billions when ≥ 1B and in millions otherwise (e.g. "$210M" instead of "$0.21B"). Y-axis ticks use the same logic, with zero rendered as "0" rather than "0.0M".
v1.7.12026-06-02
Improved
  • Symbol page performance cards. The Performance and Volume section now shows raw return alongside vs-SPY relative strength for each period (5D, 1M, 3M, 6M, 1Y) using the same bordered-card style as Technical Summary. Raw % is the primary value; "vs SPY" sits smaller below it, making the data immediately readable without requiring knowledge of relative-strength conventions.
  • 6M and 1Y RS columns. Sectors table and Group Detail member table now include 6M RS and 1Y RS alongside the existing 5D/1M/3M columns, giving a fuller picture of trend duration.
Fixed
  • Fundamentals re-fetch for missing earnings. Symbols that have a fundamentals snapshot but zero earnings history entries now trigger a re-fetch on the next update run, catching stocks that were first fetched before the earnings feature shipped.
  • Prune delisted job wired in. prune_delisted now runs at the start of every run_update.py cycle, keeping the universe clean without manual intervention.
v1.7.02026-06-01
Added
  • Cash Flow chart tab. New "Cash Flow" tab on the Fundamentals charts panel showing quarterly Operating Cash Flow and Free Cash Flow as grouped bars. Capex is shown in the hover tooltip. Data sourced from ticker.quarterly_cash_flow and ticker.cash_flow via yfinance (~6–7 quarters of history).
Fixed
  • Misclassified asset types. update_fundamentals now uses Yahoo Finance's own quoteType field as the source of truth instead of the local symbols.asset_type, and writes the correction back to the symbols table. Symbols like IAG that were wrongly registered as ETF are auto-corrected on their next refresh.
  • Symbol page crash on fresh DB. getFundamentalsSnapshot and getFundamentalsHistory now return null/[] instead of throwing when the fundamentals tables don't exist yet.
  • Stale fundamentals missing description and earnings. Symbols fetched before the long_summary and earnings_history features were added now automatically re-fetch on the next run_update.py run rather than being skipped by the 7-day staleness guard.
v1.6.02026-06-01
Added
  • Company fundamentals on symbol pages. Each /symbols/[ticker] page now has a Fundamentals section backed by Yahoo Finance. A snapshot panel shows trailing P/E, forward P/E, P/B, P/S, EV/EBITDA, market cap, gross/operating/net margins, revenue growth, and forward EPS. Data is cached in SQLite and refreshed when stale (>7 days) or when an earnings date has passed since the last fetch.
  • Fundamentals charts. Four chart tabs (Revenue, Earnings, Valuation, Margins) show quarterly historical data via Recharts. The Earnings chart uses non-GAAP reported EPS from ticker.earnings_dates and includes analyst estimates and beat/miss surprise % in the tooltip. Bars are color-coded green/red.
  • Company description. longBusinessSummary from Yahoo Finance is shown in the symbol page header below the company name, collapsed to 3 lines with a "Read more" toggle.
  • Force-refresh button. A per-symbol refresh button on the Fundamentals panel triggers a live fetch of ticker.info and ticker.earnings_dates, bypassing the staleness cache, and re-renders the page on completion.
  • `update_fundamentals` job. New Python job (services/engine/jobs/update_fundamentals.py) runs as part of run_update.py. Fetches fundamentals snapshot, income statement history, and earnings release history per symbol, skipping ETFs and index symbols for income statement data.
Changed
  • Planned Data section. The "Fundamentals" placeholder panel has been removed; the three remaining placeholders (News, Retail Sentiment, Analyst Opinion) are kept in a 3-column grid.
v1.5.02026-05-29
Added
  • Collapsible sidebar. A hamburger toggle button in the top bar collapses and expands the navigation sidebar, giving the full viewport width to the content area. Desktop preference is persisted in localStorage. On mobile the sidebar always loads collapsed and closes automatically after navigating to a page.
v1.4.12026-05-28
Fixed
  • Mojibake in source files. The × character was corrupted to × in GlossaryDrawer, GroupsPanel, and ScoringPanel due to a Windows UTF-8/Windows-1252 encoding mismatch. Replaced with Unicode escapes (×) which are immune to this class of corruption.
Changed
  • Sectors table column headers. Removed the ? badge from tooltipped column headers — tooltips still activate on hover, the icon is no longer shown.
v1.4.02026-05-28
Added
  • Symbol detail page (`/symbols/[ticker]`). Clicking any ticker in the Leaders, Volume, Technical, or Group Members tables now navigates to a dedicated page for that symbol. The page shows: price and today's return vs SPY; group memberships; 5D / 1M / 3M relative strength, relative volume, and z-score; the volume signal classification with its description; RSI across five timeframes (15M, 1H, 4H, 1D, 1W) and MACD on the 15M; recent alerts from the last seven days; and placeholder panels for future data layers (fundamentals, news, sentiment, analyst opinion).
  • TradingView shortcut. A compact shortcuts bar below the symbol header links directly to TradingView for the current ticker, opening in a new tab. Additional external services can be added to the SHORTCUTS array in the page file.
  • Symbol links in all tables. Tickers in the Leaders, Volume, Technical, and Group Members tables are now hyperlinks to their symbol page.
Improved
  • Technical Summary card layout. RSI and MACD cards now use sm:grid-cols-4 at medium width (was sm:grid-cols-5), giving an even 4 + 4 wrap before the full 8-column row at large screens.
  • RSI / MACD label casing. All timeframe suffixes are consistently uppercase (15M, 1H, 4H, 1D, 1W).
v1.3.02026-05-28
Added
  • LIVE indicator moved to global header. The pulsing "LIVE · HH:MM ET | local" badge now appears in the top bar on every page (left of the Refresh button), replacing the per-page indicator that only existed on /sectors.
  • "as of" timestamp. The top bar date label now appends · HH:MM ET when intraday data is available, so the last update time is always visible.
Improved
  • Alert bell redesigned. Replaced the inline icon+count with a bordered bell button and a corner pip, matching standard notification affordance. Dropdown now uses fixed positioning so it is no longer clipped by the header's overflow-hidden.
  • Volume table: "vs SPY" column removed. The relative-return column was visually redundant with Today % on most days. The value still drives all signal logic in the background and is shown in the signal tooltip conditions.
  • Volume table: "No Setup" replaces dash. Rows with data but no matched signal now show a quiet "No Setup" label (no pill, text-text-3) with a tooltip explaining why, instead of an ambiguous em-dash.
  • Tooltip `showIndicator` prop. Tooltips can now suppress the ? circle glyph when the trigger element is self-explanatory.
  • Sector type pill contrast. The sector / theme / index pill in /sectors uses text-text-3 instead of text-text-4 for legibility.
v1.2.02026-05-27
Added
  • Settings > Display panel. New tab in /settings with a toggle for the Premarket column. When off, the Premarket column is hidden from the Technical table and the Premarket nav item is hidden from the sidebar. Preference stored in app_settings (display_preferences key).
Improved
  • Company name display. New fmtCompanyName helper strips trailing legal suffixes (Inc., Corp., Ltd., LLC, plc, N.V., S.A., AG, etc.) from company names shown in the Volume, Leaders, and Technical tables, reducing visual noise for long names.
  • Signal column is now sortable. Market Radar Signal column (HOT / STRONG / WATCH / WEAK) now supports ascending/descending sort via a numeric tier mapping.
v1.1.02026-05-27
Fixed
  • Volume z-scores now correct on repeat intraday runs. When the engine ran more than once during the trading session, update_daily was skipping the 1d candle refresh for symbols already fetched that day. Leader stocks (which have no 5m candle history) were then using a stale early-morning partial volume as their projected full-day volume, collapsing nearly all z-scores to deeply negative values. ETFs were unaffected because they derive cumulative volume from the fresh 5m candle sum. Fix: update_daily now re-fetches today's partial candle for all symbols when the market is open, so every subsequent engine run gives leaders an up-to-date volume baseline.
v1.0.22026-05-27
Fixed
  • Group members table restored. /groups/[id] was showing a Glossary instead of the leader members table — GroupMembersTable.tsx was accidentally overwritten with Glossary content during the v1.0.0 design system rename pass. Symbol, company, price, returns, and relative volume columns now display correctly.
v1.0.12026-05-27
Fixed
  • Group detail page restored. /groups/[id] was accidentally overwritten with Glossary content during the v1.0.0 design system rename pass. Page now correctly shows group name, ETF metrics, intraday data, and leader members table.
  • Rank numbers in Market Radar now render in text-4 decorative tone (#4A525E) as intended. A stale --color-text-primary reference in the base CSS rule was preventing the token rename from taking effect.
  • Type pills (THEME / SECTOR) in Market Radar group column are now uppercase.
v1.0.02026-05-27
Added
  • Design system v2 — full token, font, and component overhaul. Replaces the original ad-hoc palette with a cohesive v2 system: OKLCH semantic colors, IBM Plex Sans + JetBrains Mono via next/font/google, and a four-level text contrast ramp (text-1 14.8:1 → text-4 2.2:1).
  • ScoreBar component. Score column on Market Radar now renders a numeric value above a proportional magnitude bar (max = 12), color-coded by tier (HOT amber, STRONG green, WEAK red, WATCH blue, NEUTRAL gray).
Changed
  • SignalBadge redesigned as soft-tinted pills with a leading pip dot and tier-matched border — replaces solid-fill badges.
  • Market Radar table restructured: Signal column moved to position 4; tier row accents (HOT amber wash + left border, STRONG/WEAK/WATCH left borders); group type pill (THEME purple, SECTOR muted) uppercase; rank column uses decorative text-4 tone.
  • Sidebar active route gets a blue left accent; section group labels use font-mono caps; disabled Premarket item uses text-4 decorative tone.
  • TopBar index chips display symbol, directional caret, and signed percent in a bordered pill; "as of" timestamp uses muted uppercase styling.
  • Tooltip ? badge upgraded to 11px circled icon with border-border-strong.
  • Volume page filter chips pick up semantic color when active (Bullish green, Bearish red, Breakouts/High Conviction amber, Watch blue); Top Active Groups cards get a 2px left accent by tier; volume table rank column uses text-4, z-scores ≥ 2σ use amber warning color.
Improved
  • Text contrast across all pages: text-3 (#6B7480, 3.4:1) for readable metadata; text-4 (#4A525E, 2.2:1) reserved for decorative chrome (rank numbers, em-dashes, dividers) only.
v0.6.02026-05-26
Fixed
  • Rel Vol and Z-Score no longer deflate during market hours. The root cause was that today's daily candle is partial mid-session, making raw volume appear artificially low. Both metrics now use a projected full-day volume instead.
Added
  • Volume pace (VP%) projection for Rel Vol and Z-Score. During market hours, today's running cumulative volume is divided by the median historical participation fraction at the same time of day — the same volume pace method used in institutional OMS systems (Bloomberg, Fidessa). The 20-day baseline always uses only complete historical sessions.
  • Automatic 5m candle history backfill. On first run, the engine fetches up to 60 days of historical 5m data for all ETFs and benchmarks to seed the participation curves. Subsequent runs skip this step in under 0.1s.
  • Projection fallback chain. Each symbol resolves its curve in order: own 5m history → group ETF's curve → SPY curve → linear (time-proportional) → raw candle. No symbol is left without an estimate.
Improved
  • Glossary — Rel Vol entry rewritten to explain the VP% projection, the 20-day completed-session baseline, and the Bloomberg/Fidessa context. Includes an intraday worked example.
  • Glossary — Z-Score entry updated to note it uses the same projected volume as Rel Vol for consistency throughout the session.
v0.5.02026-05-26
Added
  • Contextual Glossary drawer on every content page. A "? Glossary" button next to each page title opens a slide-in panel showing only the terms relevant to that page. Currently wired on Market Radar, Leaders, Technical, and Volume. Full glossary at /glossary is unchanged.
  • Single source of truth for glossary content. All terms live in lib/glossaryTerms.ts. Each term carries a pages array — adding a term to a page drawer requires only adding the page name to that array, with no other files to change.
  • RSI and MACD terms in Glossary. Three new entries: RSI — Relative Strength Index (with overbought/oversold zone table), RSI Timeframes (15m / 1h / 4H / 1D / 1W explained), and MACD — 15m (EMA12 − EMA26 formula, line vs signal interpretation).
  • "Triggered by" section in volume signal tooltips. Hovering a Volume Signal badge now shows a two-layer tooltip: the plain-English meaning followed by the exact values that caused the signal to fire (e.g. Today +19.87% ≥ +5%, Z-Score +5.9σ ≥ +3σ). Only the metrics that met their threshold are shown for OR-gated signals.
Changed
  • Volume signal tooltip text rewritten to be shorter and less confident. Removed overstatements such as "Institutional buying likely" in favour of observational language with explicit prompts to verify the catalyst.
  • Inactive filter buttons and helper buttons stepped up from text-text-muted to text-text-secondary for legibility. text-text-muted (#474D57) was producing ~1.6:1 contrast against dark backgrounds — now reserved for decorative chrome only (row numbers, separators, placeholder dashes).
Improved
  • ARCHITECTURE.md, FEATURES.md, and DESIGN.md updated to document the glossary single-source-of-truth pattern, the volume feature set, volume signal badge color conventions, the contextual glossary drawer pattern, and the text contrast rules.
v0.4.12026-05-25
Added
  • Top Active Groups cards above the Volume Spikes table. Groups are scored using bullish − bearish + (★ bullish × 2) + (Momentum Move × 0.5) and classified into five tiers (Strong Bullish → Strong Bearish). Each card shows group name, classification, bullish/bearish signal counts, average today % and vs SPY, and top symbols. Max 6 cards, sorted by score. Cards respect the active ETF/Stock and group type filters.
  • Top Active Groups entry in Glossary — formula, classification table with score ranges, and a worked example.
v0.4.02026-05-25
Added
  • Volume Signal column in Volume Spikes table. Each row is automatically classified into one of nine signals (Bullish Breakout, ★ Strong Bullish Breakout, Momentum Move, Bearish Breakdown, ★ Strong Bearish Breakdown, Bearish Momentum, Buying Pressure, Selling Pressure, Bullish Watch) based on price return, SPY-relative return, Z-Score, relative volume, and — for Bullish Watch — trend context from MA20/MA50 and multi-period returns. Badge shows beginner-friendly label; hover reveals professional name and meaning. Column is sortable.
  • Volume Signals section in Glossary. Each signal is documented with its beginner description, professional name, and exact pseudo-formula used by the classifier.
Changed
  • ETF filter unchecked by default on the Volume Spikes page. Filter state (ETF toggle, group filter) is now persisted in sessionStorage so choices are restored when navigating back to the page.
  • Bullish Breakout and Bearish Breakdown use an OR gate for volume confirmation. Previously all four conditions (price, vs SPY, Z-Score, Rel Vol) were required simultaneously. Now a large price move (≥ +7% / ≤ −7%) or high relative volume (≥ 2×) alone satisfies the volume requirement, preventing strong movers from showing blank.
v0.3.42026-05-20
Added
  • Price column in group detail view. Latest daily close price shown as the first numeric column after the stock name, consistent with the Technical Indicators page.
Removed
  • Role column removed from group detail view. All listed stocks are leaders, so the column added no information.
v0.3.32026-05-20
Changed
  • "All" filter on Market Radar excludes index groups. Sectors and themes are shown by default; click the new "Index" filter button to view index groups separately.
Improved
  • Filter state persists across navigation. Active filters on Market Radar, Volume Spikes, and Technical Indicators are stored in the URL (e.g. ?filter=sector), so navigating to a group detail page and pressing "← Market Radar" restores the exact filter. Hard-refreshing a filtered URL also restores state.
v0.3.22026-05-19
Added
  • Company names in symbol columns. Leaders, Technical, and Volume pages now show the full company name next to each ticker in a small muted label.
  • Company name backfill job. backfill_company_names runs at the start of every update cycle, fetching names from Yahoo Finance for any symbols missing them.
v0.3.12026-05-18
Changed
  • Dark thin scrollbar across the entire UI. 6px track, dark background matching --color-bg, subtle gray thumb (--color-border) that brightens on hover (--color-border-strong). Covers both Firefox (scrollbar-width/color) and Chromium (-webkit-scrollbar).
v0.3.02026-05-18
Added
  • Changelog page at `/changelog`. Reads CHANGELOG.md from the repo root at request time using fs.readFileSync — no extra dependencies. Renders version headers, section tags (Fixed, Added, Changed, etc.), inline bold and backtick code spans. Accessible from the sidebar nav and by clicking the version label below the logo.
Changed
  • Section tags are color-coded: Fixed/Security → red, Added/Performance → green, Changed/Improved → amber, Removed/Deprecated → gray.
  • Bullet points use a amber arrow for a terminal-style look consistent with the rest of the UI.
v0.2.22026-05-18
Fixed
  • Top bar ticker values showed the previous day's close instead of live prices. getIndexPerformance() was anchored exclusively to the last completed 1d group score date, so SPY, QQQ, IWM and DIA always displayed their prior-day return until compute_rankings.py re-ran after market close. The query now prefers today's intraday return_pct from computed_returns when available (populated by update_intraday.py throughout the trading day), falling back to the last daily close for symbols without intraday data (^GSPC, ^IXIC).
v0.2.12026-05-18
Fixed
  • Top bar indexes (SPY, NASDAQ, etc.) were also frozen at build time. layout.tsx fetches index performance and the as-of date for the top bar, but was not marked dynamic. Added export const dynamic = "force-dynamic" so the top bar re-fetches on every request alongside the page data.
v0.2.02026-05-18
Fixed
  • Pages no longer serve stale build-time data. All data pages (/sectors, /leaders, /volume, /technical) were missing export const dynamic = "force-dynamic", causing Next.js to pre-render them at deploy time and cache that snapshot indefinitely. Added the directive so each page queries SQLite fresh on every request. The manual refresh button and scheduled data updates now reflect immediately in the UI.
  • Python jobs use explicit UTC timezone. update_daily.py and update_intraday.py now use datetime.now(timezone.utc) consistently, matching compute_indicators.py.
  • `update_daily.py` no longer re-fetches the last stored candle. Incremental fetch start is now last_date + 1 day instead of last_date, avoiding a redundant yfinance download on every run.
v0.1.0initial release
  • Daily and intraday market radar with sector/theme group rankings
  • Leader stock rankings with relative strength across timeframes
  • Volume spike scanner with Z-score anomaly detection
  • RSI (5 timeframes) and MACD 15m technical indicators for all leaders
  • Configurable scoring weights, RSI thresholds, and group/member management
  • Automated deploy pipeline via GitHub Actions to VPS