Loading...

What is this page?

The portfolio overview for 14 tracked companies across four sectors: AI Infrastructure, Defense & Security, Quantum Computing, and Energy & Power. Every number on this page updates automatically through a pipeline of scheduled tasks, API calls, and analyst vetting. Click any ticker to open a deep dive with financials, analyst details, and health scores.

Stat boxes

Upgrades / Downgrades (30d) — how many of your 14 tickers received an upgrade or downgrade from a vetted analyst in the last 30 days. Only actions from analysts who passed the composite scoring system are counted (see "How analysts are chosen" below). A ticker with multiple actions still counts once. Earnings Reported — companies that reported earnings in the last 14 days. A "beat" means EPS actual ≥ EPS estimate. Source: FMP earnings-company endpoint, pulled daily. Thesis Alerts — count of tickers with active concerns. Combines two sources: (1) client-side threshold checks run on every page load (price above PT consensus, consensus at Hold or Sell), and (2) AI-evaluated alerts from the daily Claude Opus analysis routine (PT declining, revenue decelerating, cash runway short, filing red flags, etc.).

Sector pills

One per sector. Company count, total Buy ratings across all companies in that sector, and average price target upside. Upside formula: (PT consensus - current price) / current price × 100.

Table columns explained

Price — last close from FMP quote data, updated daily by the scheduled task and on-demand via the Refresh button. P/E (Price-to-Earnings) — how much investors pay per dollar of earnings. Lower means cheaper relative to earnings. The dashboard uses FMP's trailing-twelve-month (TTM) P/E when available. If missing, it falls back to the most recent quarterly EPS × 4, with a guard: if net income is >80% of revenue, it's likely a one-time gain (e.g., IONQ's $805M), so P/E is suppressed rather than showing a misleading number. Pre-revenue companies (IONQ, RGTI, QBTS, OKLO) always show "—" because P/E is meaningless without earnings. Consensus — the overall analyst recommendation: Buy, Hold, or Sell. Determined by the majority of rated analysts. Only vetted analysts contribute — see below. Buy / Hold / Sell — raw count of analyst ratings in each category. "Strong Buy" is grouped with Buy; "Strong Sell" with Sell. PT Consensus — the average price target from vetted analysts who issued one. Not all analysts provide price targets, so the count may differ from the Buy/Hold/Sell total. Upside — percentage difference between current price and PT consensus. Green = stock is below the target (analysts expect it to go up). Red = stock is above the target. Mkt Cap — market capitalization (share price × total shares outstanding).

How analysts are chosen

Not all analyst opinions are equal. The dashboard uses a custom vetting pipeline that runs on the host machine via Windows Task Scheduler: Step 1 — Scraping: Every night at 10 PM ET, benzinga_scraper.py pulls that day's analyst ratings from Benzinga. New analysts with ≥70% Benzinga accuracy get their full history scraped by benzinga_discover.py. Step 2 — Scoring: Every two weeks, analyst_rankings.py evaluates every analyst's track record using historical price data. A "Buy" is correct if the stock rose ≥10% within 12 months; a "Sell" is correct if it dropped ≥10%. Recent calls (last 12 months) are weighted 2× more than older ones. Each analyst gets a composite score (0–100) from four components: buy accuracy (40% of score — how often their Buy calls are right, recency-weighted), directional accuracy (25% — all calls), portfolio ticker coverage (20% — how many of your 14 tickers they cover), and statistical confidence (15% — penalizes thin sample sizes, scales linearly to 100 rated calls). Step 3 — Qualification: Analysts with a composite score ≥ 45 enter the qualified pool (adaptive size, 20–60 analysts). They must stay above the quality floor for 2 consecutive biweekly evaluations to reach "qualified" tier, and 5 evaluations with a buy accuracy ≥ 50% to reach "veteran." Demotion is slow — qualified analysts get a 2-evaluation watch-list buffer before dropping. The daily collector (a scheduled GitHub Actions workflow) reads the latest vetted analyst data and writes it into daily.json. This is why you see specific analyst names, ranks, and accuracy scores rather than anonymous aggregates.

Refresh button

Pulls live quotes from FMP via the Cloudflare proxy, updates prices in the browser, then auto-saves to GitHub via save.js. Analyst ratings and price targets are NOT re-fetched — those come from the Benzinga pipeline and only update nightly. 60-second cooldown between refreshes.

How data gets here

Each morning a scheduled GitHub Actions workflow (daily.yml) runs the daily collector: it reads companies.json for the ticker list, pulls quotes, earnings, and insider trades from FMP plus vetted Benzinga analyst data, builds pipeline health, and commits public/daily.json to the repository. Separate scheduled workflows refresh macro data, SEC filings, and the weekly financials. On page load the browser fetches daily.json, weekly.json, and analysis.json from the Cloudflare Pages site and renders everything. Persistent state (the SQLite databases) lives in a Cloudflare R2 bucket that the workflows sync at the start and end of each run.
Company Detail Table · Click any ticker for deep dive
Ticker Industry Price P/E Consensus Buy Hold Sell PT Consensus Upside Mkt Cap

What is this page?

A feed of recent events across your portfolio — earnings results, analyst upgrades and downgrades, and thesis warning flags — plus a grid showing the health of each investment growth factor. The goal is to answer "what happened since I last looked?" in one glance.

Recent Events feed

Shows up to 12 event cards, sorted by date (most recent first). Three event types: Earnings Beat / Miss — appears when a company reported earnings in the last 14 days. Shows EPS actual vs. analyst estimate and the percentage difference. A "beat" means the company earned at least as much as analysts expected. Source: FMP earnings-company endpoint, pulled daily. Analyst Upgrades / Downgrades — rating changes from vetted Benzinga analysts in the last 30 days. Each card shows the analyst's name, firm, rank in the composite scoring system, their historical accuracy percentage, the action taken (upgrade/downgrade/initiation), the new rating, and the price target if one was issued. Source: the nightly Benzinga scraper pipeline. Thesis Alerts — tickers trading more than 10% above their price target consensus. This is a simple client-side calculation: (price - ptConsensus) / price. These cards flag stocks where the market has outrun analyst expectations.

Thesis Health grid

Your portfolio is organized around 13 investment growth factors across three tiers — for example, "AI Data Center Buildout" (tier 1) links NVDA, VRT, MRVL, and PLTR. Each card represents one growth factor and shows: Letter grade (A/B/C/D) — an overall health assessment of that investment thesis. When AI pipeline data is available (shown with an AI badge), Claude Opus assigns the grade after evaluating mechanical metrics in the context of the full data picture. When pipeline data isn't available, the grade is computed client-side: A if average buy % ≥ 80% and average upside ≥ 20%; B if buy % ≥ 60% and upside ≥ 0%; C if buy % ≥ 50%; D otherwise. Assessment text — a 1–2 sentence AI-written explanation of the grade (only present with pipeline data). Stats — average PT upside and average buy percentage across the linked companies, plus upgrade/downgrade counts in the last 30 days. Growth factors are defined in companies.json and represent the investment theses behind your portfolio — the reasons you own each stock. The health grades help you monitor whether those reasons are still valid.
Recent Events
Thesis Health
AI Thesis Analysis

What is this page?

Daily thesis validation for each of your 14 companies. This is not a data summary — it's an analysis that identifies what changed, what matters, and whether each investment thesis is still intact. Generated by Claude Opus, the most capable AI model available, running in a dedicated context window separate from data collection.

How it's generated

Twice a week (Monday and Thursday), a scheduled GitHub Actions workflow (analysis.yml) runs the AI analysis. It reads the merged daily.json and weekly.json and analyzes every company in the portfolio. It uses Claude Opus specifically because reasoning quality matters here — this is where the system draws conclusions, not just collects data.

What the AI sees for each company

Opus has access to every data section the pipeline collects: live quotes and price changes, analyst ratings from vetted Benzinga analysts (with names, firms, ranks, accuracy scores), price target consensus and how it's trending vs. the previous run, earnings results (EPS actual vs. estimate, revenue), full quarterly financials (income statement, balance sheet, cash flow, key metrics), financial health scores (Piotroski F-Score for financial strength, Altman Z-Score for bankruptcy risk, DCF valuation), insider trades (both the 7-day daily scan and the 90-day quarterly picture — with names, titles, dollar amounts), sentiment scores and headlines, earnings call transcripts (guidance, risk factors, highlights), defense contract awards (for defense stocks), workforce signals (hiring/layoffs), institutional ownership changes, macro data (fed funds rate, CPI, GDP, unemployment, treasury yields, yield spread, high-yield credit spread), SEC filing summaries from the EDGAR pipeline (themes/catalysts, risk factors, management tone, cash position, red flags — extracted from 10-Ks and 10-Qs by Sonnet), and the growth factor configuration that defines why each stock is in the portfolio.

Analysis philosophy

The prompt instructs Opus to follow specific rules: lead with what changed and what matters now — don't walk through every metric. Identify divergences and contradictions (insider selling while analysts upgrade, strong earnings but deteriorating macro). Evaluate the investment thesis — is the reason you bought this stock still valid? Flag actionable items (upcoming earnings, expiring catalysts, position sizing concerns). Tailor depth to what's interesting — a company that just won a $446M contract gets 3–4 sentences; one where nothing happened gets one sentence. Pre-revenue companies (IONQ, RGTI, QBTS, OKLO) are evaluated on cash runway, revenue trajectory, and technology milestones — not P/E or DCF. Insider buys are weighted heavily as conviction signals; insider sells are flagged only when the pattern is unusual. SEC filing data is treated as ground truth — when management's legally-required disclosures contradict analyst sentiment, that divergence is called out.

What the data summary row shows

Each analysis card has a gray data row showing: current price, analyst consensus (Buy/Hold/Sell), buy percentage (how many analysts rate Buy out of total), and PT upside (how far the price target is above or below the current price).

Signal ratings

Each company's analysis ends with a signal: Positive (weight of evidence supports the thesis), Mixed (conflicting signals), Negative (thesis is under pressure), or Neutral (nothing noteworthy). The signal reflects the total evidence picture, not just price action — a stock at all-time highs with deteriorating fundamentals could be Mixed or Negative.

Staleness detection

When you open this tab, the dashboard snapshots the current data (prices, PTs, consensus) and compares it to what the analysis was written against. If material changes have occurred since the analysis was generated, a yellow staleness banner appears. This prevents you from reading yesterday's analysis as if it reflects today's data.

Filtering

The filter buttons at the top let you narrow by sector (AI Infrastructure, Defense & Security, Quantum Computing, Energy & Power) or show all.

Daily thesis validation powered by Claude Opus. Evaluates all collected data to identify what's changed, what matters, and whether each investment thesis is intact. Not financial advice.

Analysis is generated daily by the scheduled task. It will appear here after the first run.
Thesis-Breaking Alerts

What is this page?

This page monitors standing conditions that could threaten your investment theses. Unlike the "What Changed" feed (which shows events), these are persistent assessments — an alert stays active as long as its underlying condition holds, and clears automatically when the condition resolves.

Growth Factor Health badges

The row of colored badges at the top shows each of your 13 growth factors with a letter grade (A through D). These are the same factors shown in the Thesis Health grid on the What Changed page, but in a compact format. Hover over any badge to see the assessment text and linked companies. A purple dot on a badge means the grade was assigned by Claude Opus (from the AI Analysis Routine). No dot means it was computed client-side as a fallback. Factors graded C or D get expanded text below the badge row explaining why they're under pressure. The grades represent the health of your investment theses — the reasons you own each group of stocks. For example, if the "AI Data Center Buildout" factor is graded A, it means NVDA, VRT, MRVL, and PLTR are collectively showing strong analyst support, positive upside, and recent upgrades. If it drops to C, the thesis behind owning those four stocks is weakening.

Alert severity levels

Alerts are sorted by severity. Danger (red) means the thesis is actively threatened and needs attention. Warning (amber) means a concerning signal worth monitoring. Info (blue) means flagged by the system but likely benign or already priced in.

AI alerts (purple "AI" badge)

Generated daily by Claude Opus in a two-stage process. First, a mechanical rule engine checks for triggered conditions across the portfolio: Company-level: price target consensus declined >10% since last run, analyst consensus shifted from Buy to Hold or Sell, revenue growth decelerating quarter-over-quarter, pre-revenue company cash runway below 12 months, stock trading >20% above PT consensus. SEC filing-level: filing thesis impact rated "weakens" or "mixed," going concern language present, material weakness disclosed, pre-revenue runway below 12 months per the filing, theme conviction regressing across recent filings, filing red flags present, management tone defensive. Sector-level: 3+ companies in the same sector received downgrades within 30 days. Macro-level: elevated fed funds rate (≥3%) with pre-revenue holdings in portfolio, high-yield credit spread widening above 4.5% (risk-off signal). Growth-factor-level: any growth factor graded C or D. Second, Opus evaluates each triggered condition in the context of all available data and writes a 1–3 sentence assessment. The AI assigns the severity level — a 12% PT decline might be "info" if the CEO just bought $3M in shares, or "warning" if revenue is also decelerating. The since date persists across runs so you can see how long a condition has been active.

Auto alerts (gray "Auto" badge)

Real-time client-side threshold checks that run on every page render — no pipeline required: Price above PT — danger if trading >10% above consensus PT, warning if at or slightly above. If the AI pipeline already covers this ticker's PT alert, the auto version is suppressed (no duplicates). Consensus deterioration — warning if consensus is Hold, danger if Sell. Also deduplicates with pipeline alerts. High sell percentage — danger if ≥15% of analysts rate Sell. Pre-revenue flag — info-level notice for each pre-revenue company (IONQ, RGTI, QBTS, OKLO). Speculative concentration — warning if 3+ pre-revenue companies are in the portfolio. Sector concentration — info if 5+ companies are tracked in a single sector.

Catalyst Discovery

The card below links to the Discovery tab, which surfaces companies found in your portfolio companies' SEC filings, earnings transcripts, and institutional ownership data.

Standing conditions that threaten investment theses. AI-evaluated alerts (marked AI) are generated daily by Claude Opus using cross-cutting analysis across all data sources. Auto alerts are real-time threshold checks.

Catalyst Discovery

Company discovery signals from SEC filings, transcripts, and institutional data are shown on the Discovery tab →

News Feed

What is this page?

A live news feed for all 14 tracked companies. Unlike the other pages, this data is not pre-collected by the scheduled pipeline — it loads fresh from FMP every time you open the tab.

How it works

When you click the News tab for the first time in a session, the dashboard makes 14 API calls (one per ticker) to FMP's search-stock-news endpoint, requesting the 8 most recent articles per company. The calls go through the Cloudflare proxy at rhinomarket.pages.dev/api/fmp, which adds your FMP API key server-side. Articles from all 14 tickers are combined into a single feed, deduplicated (by title + publisher to avoid the same story appearing under multiple tickers), and sorted newest-first. The feed shows 20 articles at a time with a "Load More" button to see older ones.

Filtering

The filter buttons at the top let you narrow by sector. When you select a sector, only articles from companies in that sector are shown. Each article is tagged with the ticker it was pulled for, so you can see which company the story relates to.

What each card shows

Ticker symbol, publication date (shown as relative time — "2h ago," "Yesterday," or a specific date), article title (linked to the full article), a 180-character snippet of the article text, and the publisher name.

Data source

FMP search-stock-news endpoint. This is a financial news aggregator that pulls from major business publications, wire services, and financial media. The data is proxied through functions/api/fmp.js on Cloudflare Pages to keep the API key server-side.

Limitations

News only loads when you open the tab — it's not pre-fetched or cached by the daily pipeline. If your network blocks the Cloudflare proxy (sometimes happens from the artifact viewer), all 14 calls will fail and you'll see a message with a link to the live site where it works. Individual ticker failures don't block the rest — you'll just see fewer articles.

Latest news across all tracked companies. Pulls live from FMP when you open this tab.

Switch to this tab to load the latest news.
Signal Feed

What is this page?

The Discovery tab surfaces companies that appear in your portfolio companies' SEC filings, earnings transcripts, and institutional ownership data — companies you don't currently track but that have a relationship to your investment theses.

Signal Feed

Signals are generated weekly by the pipeline scanning transcripts, filing summaries, and institutional data for mentions of non-portfolio companies. Each signal shows which portfolio company generated it, what type of mention it was, and a brief description. Signals are sorted by weight (stronger relationship signals first) and date. Filing mentions — a portfolio company named this company in an SEC filing (10-K, 10-Q) as a partner, supplier, customer, or competitor. Transcript mentions — a portfolio company's management discussed this company during an earnings call. Theme overlap — this company appears in SEC filing themes/catalysts shared with your portfolio companies. Generated by the filing intelligence pipeline. Institutional — major institutional holders of your portfolio companies also hold significant positions in this company.

Actions

Watch moves the company to your Candidate Watchlist below. Dismiss hides the signal (persists across sessions).

Candidate Watchlist

Companies you've decided to watch. Click Investigate to pull a real-time FMP snapshot (quote, analyst consensus, price targets, financial scores, company profile). This costs 6 API calls per company. Promote queues the company for addition to your tracked portfolio. It will be added to companies.json on the next daily reconcile run, receiving full data collection from that point forward.

Data availability

Signal data requires the weekly pipeline to have run with the feeder signal scanning step enabled. If no signals appear, the pipeline may not have generated feeder signals yet.

Analyst Top Picks

The bottom card surfaces non-portfolio companies that have the strongest buy consensus from your vetted analyst pool (qualified and veteran tier analysts only, minimum 3 analysts covering the ticker). This data is generated nightly by `dashboard_export.py` as part of the Benzinga scraper pipeline. Picks include FMP price and market cap data pulled during the nightly export, so the entry cost filter works on prices that are at most 24 hours old. Use the price cap input to exclude stocks above your budget threshold. Sort by buy percentage, PT upside, or analyst coverage depth. Click Watch to add a top pick to your Candidate Watchlist for investigation and potential promotion.

Companies surfaced from portfolio company filings, transcripts, and institutional data. Dismiss signals you're not interested in, or watch companies to investigate further.

Candidate Watchlist

Companies you're watching. Investigate to pull real-time FMP data, or promote to add to your tracked portfolio on the next pipeline run.

Analyst Top Picks

Non-portfolio companies with the strongest buy consensus from your vetted analyst pool. Updated nightly.