Appearance
Security dashboard — Snapshots & graphs
The Security dashboard is the per-instrument deep-dive view — five categories totaling ~30 sub-panels for any single ticker. This page covers the Snapshots and Graphs categories. Fundamentals and disclosures are in their own pages: Fundamentals and Disclosures.
Implemented in frontend/src/components/SecurityDashboard/. The full menu structure is defined in menuConfig.js.
Opening the dashboard
From any panel where a symbol is focused (Market panel, Watchlist, Advanced search, Globe news pin), use the 🛡 Security action or double-click the symbol. The dashboard opens to the Snapshots → Overview sub-panel by default (menuConfig.js → DEFAULT_SECURITY).
Snapshots category
Eight at-a-glance sub-panels for a single instrument:
Overview
Headline view: current price, day change, market cap, sector, industry, key ratios, and a sparkline. Source: OverviewPanel.jsx.
Description
Long-form business description from EODHD. Useful for reading what a company actually does before drilling into financials.
Percentile rank
Where the security falls inside its sector across key metrics (P/E, EPS growth, ROE, etc.). Source: PercentilePanel.jsx.
Dividend
Dividend history, ex-dates, payout ratio, yield trend. Pulls EODHD dividend feed.
Ownership
Top institutional holders and recent position changes. Snapshot, not real-time.
ETF exposure
Which ETFs hold this security and at what weight — useful for spotting passive flow concentration.
Mutual Fund exposure
Same lens, mutual funds.
Earnings history
Historical EPS surprises, revenue beat/miss, post-earnings price reaction.
Graphs category
Four chart-centric sub-panels:
Historical
Long-window EOD price chart with optional volume, dividend, and split overlays.
Comparison
Multi-symbol price comparison (rebased to 100). Add up to ~6 symbols.
Intraday
Today's tick-level chart (or last session if market is closed) with volume bars.
Performance
Total return over rolling windows (1D, 1W, 1M, 3M, YTD, 1Y, 5Y), optionally vs. benchmark.
PDF export and snapshots
The dashboard supports per-panel PDF export via pdfExportService.js and caches snapshot data in snapshotCache.js so re-opening the same ticker is fast.
PDF export captures the active sub-panel as a self-contained document with the data values rendered at export time — useful for client decks, research papers, or compliance archives where the source data must be frozen against later upstream revisions.
Reading order recommendations
The 30 sub-panels can be intimidating. For a first read on a name, this order is efficient:
- Description — what the company does. 60 seconds.
- Overview — current price + headline ratios. 60 seconds.
- Percentile rank — sector-relative positioning. 90 seconds.
- Highlights (fundamentals#highlights) — at-a-glance ratios. 60 seconds.
- Income statement (fundamentals#income) — margin trend. 2 minutes.
- Earnings history + Estimates trends (fundamentals#trends) — recent surprises and the revision context. 2 minutes.
- Comparison — overlay against 2–3 sector peers. 1 minute.
Total: ~10 minutes for a defensible first read. Skip to deep dives (cash flow, ownership, transcripts) only after this base.
Performance and snapshot caching
The dashboard's snapshot cache means re-opening the same ticker within a session is instant. Hard cache invalidation happens:
- On explicit refresh (
Ctrl+R) inside the panel. - After 1 day for fundamentals, 1 hour for ownership, 5 min for quote-derived fields.
- On user logout (snapshot cache is per-session in memory, not in Redis).
Common pitfalls
| Symptom | Likely cause | Fix |
|---|---|---|
| Whole dashboard empty | EODHD key missing or expired | Check EODHD_API_KEY; see API keys |
| Some sub-panels populated, others empty | Coverage gap on the symbol (e.g., transcripts unavailable for non-US listings) | Try a US-listed peer to verify the panel itself works |
| Fundamentals stale by a quarter | EODHD parses on its own cadence | For breaking numbers, read the filing directly from Disclosures → Filings |
| Comparison chart axes look weird | Mixing very different price levels without rebasing | Use the rebase-to-100 toggle |