Anonymous Client
Market Scanner Pro
A stock screener that ingests IBD watchlist exports, enriches them with live market data, and grades each ticker against a technical and fundamental rule engine.
The problem
Screening a stock watchlist by hand means checking each ticker against a dozen technical and fundamental criteria across multiple data sources: moving averages, relative strength, ROE, industry group rank. That’s an hour of repetitive lookup work, and it has to be redone every time the list changes.
The build
A full-stack screening app: upload an IBD CSV, and every ticker is enriched with price, moving-average, and fundamental data, then scored against a nine-rule engine (price above the 50-day moving average, 21-day over 50-day, 50-day over 200-day, positive 200-day slope, relative strength above 70, composite rating at least 80, ROE thresholds, industry-group rank ceilings). Results land in a screener workspace: a persistent TradingView-style chart on top, a sortable, filterable data table below, and multiple watchlists as tabs, each tracking when it was last scanned.
The UI is built for daily use: letter grades (A+ through E) with grade-based and multi-column lock sorting, drag-and-drop column and KPI configuration, keyboard row navigation, and preferences that persist across devices behind a secure login.
How it works
The backend is async FastAPI on Python pulling market data from Polygon and fundamentals from Finnhub, with a cache (SQLite locally, Postgres in production) and a 24-hour eviction loop to keep API usage inside rate limits. Scan progress streams to the browser over server-sent events. The front end is React 18 + TypeScript with Vite, Tailwind, Zustand, and lightweight-charts. The rule engine, CSV parser, moving-average calculator, and scan endpoints are covered by pytest, with vitest on the front end. It deploys to Render as a Python web service, a managed Postgres instance, and a static front end, defined in a Render blueprint.
Outcomes
What used to take an hour of manual lookups now takes an upload and a scan. The project also included a full v2 UI overhaul, redesigning a shipped card-grid interface into the current screener layout without losing functionality, and a data pipeline that stays inside third-party rate limits while remaining fresh enough to trade on.

