| Card | Grade | Estimate | Trend | My Cost | Gain/Loss | 24h Change | Velocity | ||
|---|---|---|---|---|---|---|---|---|---|
| No data yet. Click "Refresh Now" to scrape your collection. | |||||||||
| Card | Grade | Removed | Reason | My Cost | Sold For / Last Known | Realized Gain | |
|---|---|---|---|---|---|---|---|
| Loading… | |||||||
Every active card in your collection that has a current value. Cards without a cost basis are included.
| Bucket | Cards | Value | % of Total | |
|---|---|---|---|---|
| Loading… | ||||
Paper Gains on cards you still own. Value = current CL / PSA / PC estimate.
Among cards with a recorded cost basis only — ROI math needs both buy and sell prices. The Allocation Breakdown above includes all cards.
| Source | Cards | Total Cost | Total Value | Gain / Loss | ROI |
|---|---|---|---|---|---|
| Loading… | |||||
| Card | Source | Cost | Value | Gain / Loss | ROI | |
|---|---|---|---|---|---|---|
| Loading… | ||||||
For each PSA 8/9 card OR raw card with PC "If Graded" tile data, projected value at PSA 10 minus grading fee.
Grading outcome not guaranteed — PSA may grade lower than the target. The Target-Share column hints at how often this card tends to come back at the target, but it's a proxy, not a prediction. Already-graded cards more than 2 grades below the target are excluded — they have no realistic path. Raw (Ungraded) cards always included.
| Card | Grade | Current Value | PSA 10 Tile | Net Uplift | ROI on Fee | Target-Share | Total Pop | |
|---|---|---|---|---|---|---|---|---|
| Loading… | ||||||||
Recommended list price = median of recent comparable sales (last 90 days). Profit = sale median × (1 − fee %) − cost.
Trend compares last 30 days vs prior 30-90 days. Sales count and last-sold date hint at liquidity — a card with 1 sale 80 days ago is shakier than one with 12 sales last week.
| Card | Grade | Cost | Sale Median | Profit | Trend | Sales | Last Sold | |
|---|---|---|---|---|---|---|---|---|
| Loading… | ||||||||
For each card in your collection with PSA pop data, see how many exist at a given grade. Pick a grade to see all cards' pop at that tier (lets you answer "of my whole collection, which would be rarest if it were a PSA 10?"). Pick Own Grade to show each card's pop at the grade it's already at, grouped by tier descending.
Loading…
| Card | Grade | Pop at PSA 10 | Total Pop | Value | |
|---|---|---|---|---|---|
| Loading… | |||||
Pop data refreshes on every Full scrape via PSA's pop report. Some cards may show 0 at their own grade if PSA's pop hasn't been updated since the card was graded.
Volatility, drawdown, and return for the whole collection and per card. Advisory heuristics — values are daily scrape snapshots (illiquid, and flat between repricings), so read volatility as a relative signal, not finance-grade risk.
| Card | Grade | Volatility | Max Drawdown | Period Return | Value | |
|---|---|---|---|---|---|---|
| Loading… | ||||||
Needs ≥6 dated value points per card; thinner-history cards are omitted. Window = trailing 30 / 90 / 365 days of scraped values. Annualized volatility assumes ~daily sampling.
How easily each holding converts to cash near fair value, inferred from recorded sales — sale frequency, recency, and price consistency. Advisory heuristic: a card with no scraped sales scores low for lack of evidence, not proven illiquidity. Window = trailing 12 months.
| Card | Grade | Liquidity | Sales/mo | Est. Days to Sell | Value | |
|---|---|---|---|---|---|---|
| Loading… | ||||||
Score = 0.45·sale-frequency + 0.20·12-mo depth + 0.20·recency + 0.15·price-consistency. "Est. Days to Sell" ≈ 30 ÷ sales-per-month. Cards with no recorded sales show as "No Data". Tune the weights in src/lib/liquidity-stats.js.
A per-card Hold / Trim / Sell / Watch lean from price momentum, demand trend, your profit position, and how easily the card sells. Advisory only — it pairs with the Sell Advisor (which gives the list price) and doesn't know your taxes, conviction, or grading plans. Watch = too few recent sales to call. Hover a signal for the reasons.
| Card | Grade | Signal | 30d Momentum | Unrealized | Liquidity | Value | |
|---|---|---|---|---|---|---|---|
| Loading… | |||||||
Signal = a 0–100 pressure score from price momentum + demand trend + profit position + liquidity, bucketed Sell ≥68 / Trim ≥54 / Hold below; Watch when <3 recent comps. Pairs with — never overrides — the Sell Advisor. Tune the model in src/lib/hold-sell-stats.js.
Scenario projections are advisory heuristics, not financial advice. They model hypothetical price moves over your current marked values — not a forecast of actual prices.
Model a hypothetical market move by segment — "Pokemon −20%", "PSA 10 +15%". Shocks stack multiplicatively (a Pokemon PSA 10 hit by both = ×0.92), and the result is your hypothetical portfolio value, not a prediction.
| Card | Grade | Sport | Current | Shocked | Δ $ | Δ % | |
|---|---|---|---|---|---|---|---|
| Add a shock to see the impact. | |||||||
Shocks apply to each card's current marked value (CL / PSA / PC / manual). A card matched by several shocks gets the product of their multipliers. Hypothetical only — pairs with, never replaces, the per-card forecast. Engine: public/js/scenario-shocks.js.
Model selling a basket of cards: gross → fees → net cash, plus realized P&L vs your cost basis and a liquidity-realism read. Fees ignore taxes and listing effort — it's an advisory estimate, not a guaranteed payout.
| Card | Grade | Value | Your Cost | Gain | Liquidity | Days to Sell | Net Share | |
|---|---|---|---|---|---|---|---|---|
| Pick a basket to model a sale. | ||||||||
Net = gross − (platform % + per-card shipping). Realized P&L is computed only over the cards in the basket that have a cost basis. "Days to Sell" is a per-card estimate (selling many at once may take longer). Engine: public/js/scenario-liquidation.js.
A Monte Carlo cone of where your portfolio's value could land, bootstrapped from its recent daily moves. It's a hypothetical range from past volatility — not a forecast of actual prices, and the downside only reflects the co-movements seen in the last ~90 days (a broad market crash where everything falls together isn't in this history).
Reconstructs the active-collection daily NAV from per-card history (intentionally differs from the Dashboard total, which includes removed cards), then runs the same Monte Carlo bootstrap as the per-card forecast. Capped at 90 days — a 1-year projection from 90 days of data is statistically meaningless. Engine: public/js/scenario-portfolio-mc.js.
How concentrated is your collection's value, and what would diversify it? The effective number of holdings is how many equal-sized positions your value is as concentrated as — fewer than your card count means a handful of cards dominate.
| # | Card | Grade | Sport | Value | % of Value | Cumulative | |
|---|---|---|---|---|---|---|---|
| Loading… | |||||||
Effective holdings = 1 / HHI (the Herfindahl index, Σ of squared value-shares). Top-N share = the % of value in your biggest cards. "Trim my top N" recomputes over the collection minus those positions — a diversification what-if, not a P&L estimate. Engine: public/js/scenario-concentration.js.
Best/Worst Performers across the chosen window. Period Change = current value − value at start of window. Total Gain = current value − cost basis (cards without cost are omitted from this column).
| Card | Grade | Sport | Cost | Current Value | $ Change | % Change | Total Gain | |
|---|---|---|---|---|---|---|---|---|
| Loading… | ||||||||
| Item | Source | Grade | Est. Value (median recent sales) | Trend | 7d | 30d | ||
|---|---|---|---|---|---|---|---|---|
| Loading watchlist… | ||||||||
Automatically run Full scrapes at set times. When enabled, the scheduler fires at each enabled slot and runs a Full refresh. If your PC is asleep at a slot time, Windows' wake timer brings it out of sleep; if you were active in the last N minutes when the scrape finishes, the PC stays awake (so you don't get bounced to sleep while using it). Missed slots (PC was off) are skipped, not caught up.
For scheduled scrapes to wake your PC and fire, the Node server needs to be running when the scheduled time arrives. Run the install script once from a PowerShell window in this project's folder:
node scripts/install-autostart.js
The script registers a Windows Task Scheduler task that auto-starts the server on login AND at each enabled slot time (with "Wake the computer to run this task" checked). It also verifies that Windows' "Allow wake timers" setting is enabled. You can re-run it any time your slot times change — it re-writes the existing task.
Daily gzipped snapshots of data/psa-scraper.db pushed to the private collection-site-backup repo on GitHub. 14-day retention. Runs automatically at 17:30 EDT via Windows Task Scheduler; manual trigger below for off-cycle backups (useful before turning off the PC).
Visual density of tables, lists, and cards across the app. Stored in your browser's localStorage only — doesn't sync to the mirror or other devices.
Comfortable matches the original spacing. Compact fits ~50% more rows per screen — useful when scanning 200+ cards. Spacious adds more breathing room for cleaner-looking screens or presentations.
Personal defaults for the Forecast view. Set once on the desktop; the read-only mirror picks them up on the next publish, so phone access shows the same values.
v5.2.5 cleanup: Grading ROI / Sell Advisor / Discounted Listings preferences moved to live in-tab — adjust them directly on each tab and they persist automatically. The duplicate controls here were silently out-of-sync depending on which surface was last edited.
Default horizon chip selected when you click the Forecast view on a card's value chart.