v1.4.0
Stock Scanner v1.4.0
Stock Scanner v1.4.0 turns the Daily Snapshot into a clearer market-regime dashboard, makes scan results faster and more actionable, extends reliable multi-market RRG history to the static site, and hardens the data pipelines that keep both live and static experiences current.
Highlights
Market Health & Exposure (new)
- A transparent daily 0–100 recommended-exposure score now combines distribution days, follow-through-day context, index position versus the 50/200-day moving averages, VIX, and market breadth into a plain-language market stance (#255).
- The live Daily Snapshot and static home page share the same exposure gauge, score history, and contribution breakdown, so users can see both the recommendation and why it changed.
- Static US exposure now requires a valid SPY benchmark before publication, preventing incomplete market-health readings (#273, #289).
More actionable scan results
- The new RS Line Blue Dot signal identifies stocks whose relative-strength line is making a recent high, including “RS high before price” leadership. It is available as a persisted scan field, filter, API/static-site field, and results-table marker with date context (#278).
- Static scan results now rank by composite score consistently with the live app, while stale rows with missing or zero volume are refreshed before static snapshots are built (#275).
- Live preset filtering no longer spends tens of seconds counting blob-heavy rows: lean count queries and PostgreSQL expression indexes restore practical preset performance (#251).
- Broad-universe scans may safely omit a tiny stale tail and show a durable warning; custom and test scans remain strict (#283).
- Scan results now expose the date behind industry-group ranks, making ranking context easier to trust (#262).
Multi-market RRG history and date coherence
- Static RRG now supports the same market set as the live application and carries forward 12 compact weekly observations per market through a dedicated release asset, instead of depending on expiring workflow artifacts (#299).
- Missing history can bootstrap safely, while failed restoration or invalid state cannot overwrite known-good history.
- Rankings, movers, RRG, breadth, and snapshot freshness now share stronger “as of” semantics and date-coherence checks.
- RRG exploration adds a tail visibility toggle and clearer silver hover highlighting (#250).
Faster live experience and better mobile usability
- Persisted query caching, route-level lazy loading, a lighter initial bundle, cached group rankings, and batched chart-neighbor fundamentals make refreshes and chart browsing noticeably faster (#241, #245).
- The API can run multiple Uvicorn workers with migration-safe startup coordination (#240).
- The static site now has scrollable mobile navigation, responsive chart/detail layouts, and horizontally scrollable tables instead of collapsed charts and unreachable tabs (#247).
Data and publishing reliability
- Daily price bundles now download and import as verified streams with bounded database batches, atomic replacement, and checksum/metadata validation, preventing large-universe refreshes from being OOM-killed (#282).
- Live deployments now receive the weekly GitHub-published IBD classification bundles for every supported market; classification refresh and temporary-file handling were also hardened (#246, #271, #292).
- Lost refresh workers, delta-refresh coverage accounting, progress callbacks, and non-finite market values now fail or recover explicitly instead of leaving ambiguous runtime state (#258, #263, #267, #277, #280).
- China index identity and benchmark freshness now use market-aware symbol handling, AKShare index feeds with Yahoo fallback, and a China-only manual static build option (#288, #291, #294).
- Static publishing can retain valid last-known-good data for failed selected markets while still publishing successful current markets and enforcing completeness/schema gates (#296).
Deployment notes
- This release includes database migrations for Market Health & Exposure and scan-filter indexes. Run the normal migration step (alembic upgrade head) before serving the new backend.
- Existing deployments may optionally backfill market-exposure history so the timeline is populated immediately; otherwise it will accumulate through the daily pipeline.
- Rolling static RRG history bootstraps automatically and is maintained as a compact release asset.
Community contributions
Thanks to @kjpou1 for improving the local backend workflow, NaN handling, IBD classification updates, price-refresh progress propagation, and temporary-directory portability (#227, #258, #271, #277, #292).
Full changelog: v1.3.0...v1.4.0