Viridia
Viridia Market Scanner
Next UTC fund
Backend offline
show
show
Add to watchlisti
#Shown
0
Above both VWAPs
0
Below both VWAPs
0
±±2σ Extended
0
σMean |extension|
0.00σ
Mean opportunity
0.000
ƒMean funding
0.0000%
OIMean OI Δ24h
0.00%
Live stream: · polling + WebSocket · pairs: 0 · Truth warming… ·
Session
Caution mode
Ready now
Fresh upgrades
Deteriorations
Invalidations
Shortlist exec
Shortlist governance
Set warnings
100%
Tickers
Selectedi
Rank Ticker Z (2D) Z (7D) Z (1D·20) Funding rate Fund %ile(30d) Fund trend Silent OI RSI 15m RSI ×-sec Volume (24H, $M) Microstructure score Opportunity score Liq 1m ($) Cascade Cluster
Order book stress (L2)

Binance USD-M depth snapshots (top symbols by open interest). Bid/ask colors follow OpenBook-main semantics (green = bid-heavy, red = ask-heavy). Δ5 = change in ±1% band imbalance vs five refreshes ago (~25s at default depth cadence); Mom = bid accumulation vs offer lifting from that delta.

Bid liquidity Ask liquidity Imbalance scale (50% = mid)
L2 symbols
Walls flagged
Avg spread (bps)
Avg bid skew
Stress spectrum — imbalance near touch (±1% band)
Strongest bid-side imbalance
# Symbol Scale Imb
Most ask-heavy
# Symbol Scale Imb
L2 on scanner universe
Rank Ticker Spread Imbalance Delta
(5 refreshes)
Momentum Liquidity
(±1% + bands)
Wall

Portfolio set chooses which symbols get sparks + correlation: your watchlist, or top 25 by server rank among rows that pass current Market filters (vol, Z, quadrant, cluster, watch-only, etc.). 1h sparks auto-load here (~96 bars via server proxy, ~every 2 min). Load 1h sparks forces refresh. ⌖ focuses on Market.

ρ correlation table Collapsed — expand for full N×N grid + filters

Click a tile for symbol drilldown. Colors follow 1h metric; size is liquidity proxy.

Desk deployable table shows the top 30 rows after filters and your column sort. Change via SCANNER_DESK_RANK_LIMIT in .env (restart server).

Deployable rank Symbol Why it matters Change Cluster

Focus / workflow

Click symbols to open thesis
Immediate review
Execution candidates
Watchlist candidates
Fresh upgrades
Thesis deterioration
Recent downgrades
×Invalidated ideas
!High-risk fragile

Shortlist actionability

Style bias
Execution quality
Governance quality
Crowding
Regime fit
Correlation / redundancy
Deployable (active deployment mode)
Diversified α (family spread)
Concentrated α (correlated book)
High-trust (conservative)
Subscription

Per-symbol rules: opportunity score, z threshold, funding, OI, TF alignment, cascade; regime changes use your first saved config for delivery. Telegram bot token and SMTP stay on the server (.env).

Test dispatch

Sends a one-off message using the same channels as production (Telegram needs TELEGRAM_BOT_TOKEN + chat id).

Saved subscriptions
SymbolZ thrZ metricTG chatDiscordEmail
Outcome accuracy
ConditionEvalWin%Avg favAvg adv
Recent fires (Postgres)
Time (UTC)SymbolConditionPrioPricePreview
Last refresh: —
For maintainers

Keep this tab in sync with the live UI. When you add or rename tabs, controls, table columns, drawer blocks, API fields, or scoring rules, edit app/templates/scanner_dashboard.html (id="tabGuide").

Start here — operator workflow

1. Confirm the header backend pill is online. Set Interval (poll) and Analysis (Intraday = 2D primary z, Swing = 7D primary z).

2. Use the Market scatter + rank table to scan; click a dot or row (or set Symbol) to open the right-hand detail drawer. The client fetches /api/scanner/symbol/{symbol}/drilldown so thesis, playbook, scenarios, and monitoring populate; live row fields merge while the drawer stays open.

3. Expand Diagnostics in the drawer for funding, OI, L2, signal alignment, recent alerts, and Quick backtest.

4. Use Desk for deployable-ranked names plus workflow queues; use Alerts to manage subscriptions and Postgres fire history (feeds drawer “Recent alerts” after you load history).

5. Open this guide anytime: Guide tab, header book icon, or Guide on the live-stream line under the KPIs.

Data sources, auth & APIs

Snapshots focus on Binance USD-M perpetual contracts: last prices, 24h volume, funding, open interest, depth (L2), and liquidations where the stream is available. Multi-exchange keys in Settings are informational unless the backend is configured for them.

The UI refreshes on your REST poll interval and subscribes to WebSocket /ws/stream (JWT sent in the first message after connect; optional ?token= still supported) for incremental updates.

The strip under the KPIs shows live stream time, pair count, and truth (data-family freshness). Amber/red states mean some families are stale or warming—treat edge cases cautiously.

Auth
Scanner pages expect a Bearer token (e.g. from login). Protected routes and WebSocket require a valid JWT.
Read opportunities
GET /api/scanner/opportunities
Single symbol
GET /api/scanner/symbol/{symbol}
Operator / playbook payload
GET /api/scanner/symbol/{symbol}/drilldown
Stream
WS /ws/stream (post-connect auth JSON or ?token=)
Health
GET /health
Header bar & quick icons
Backend pill
Live vs offline reachability to the API.
Target (Market)
Jumps to Market tab.
Grid (Portfolio)
Opens Portfolio tab.
Bell (Alerts)
Opens Alerts tab.
Book (Guide)
Opens this Guide tab.
Star (Watchlist)
Toggles the watchlist rail.
Profile menu
Profile — name/avatar context (synced with auth profile when available). Settings/ui/settings. Log out — clears stored tokens.
Left column — every control

These filters apply to the Market scatter and rank table (and anything that reads the same client filter state). Values persist in localStorage where noted.

Interval
Poll cadence: 1 / 5 / 15 minutes. Key: scanner_refresh_interval.
Analysis
Intraday → primary |z| = 2D VWAP z. Swing (7D z) → primary |z| = 7D. Key: scanner_analysis_mode.
Min vol ($M)
Hide symbols below 24h notional volume.
Min |z|
Floor on absolute primary VWAP z (2D or 7D per mode).
Z direction
Absolute / Positive / Negative extension filter.
Min duration cycles
Require the extension condition to hold across consecutive refresh cycles.
Quadrant
Above / Below / Diverging vs both VWAP anchors, or All.
Cluster
Microstructure label: Noise spike, Slow grid, Crowded position, Thin market.
Chart
Canvas (default scatter) vs Plotly Z×Fund roadmap.
Axes
24h/Opp, LogVol/Opp, 2D/5D, 5D/7D, 2D/Prior week, 2D/Weekly anchor, VWAP/Fund. VWAP presets need klines; on Binance 418 / WAF, z fields can flatten—a yellow stale VWAP banner may appear; prefer ticker-based axes.
Color by
Ext (extension) or Sector.
Size by
Vol or OI notional for dot area.
Alert z
Default |z| for Save alert and new subscriptions. Synced with Settings default.
Symbol
Focus contract (e.g. BTC/USDT:USDT). Drives Selected panel, BTC factor card, and drawer context.
Save alert
Creates/updates subscription for the current Symbol (server-side rules apply).
Labels
Max ticker labels drawn on the scatter (0–20).
Cluster rings / bins
Optional scatter overlays for cluster structure.
Clear WL
Removes watchlist entries (with confirmation).
Refresh
Forces an immediate data pull.
Reset clusters
Resets cluster visualization state on the chart.
Quick presets (bundled one-click setups)

The dropdown above the watchlist strip sets many controls at once; you can edit individual fields after. Last choice is remembered in the browser.

Intraday · 2D/5D (5m poll)
Intraday, 2D/5D axes, 5m poll, Canvas, Ext color, Vol size; Alerts extension z → 2D VWAP.
Swing · 5D/7D + daily z alerts
Swing, 5D/7D, 15m poll, $10M vol, min |z| 1; Alerts extension z → Daily VWAP (20d).
Funding vs VWAP · Plotly
VWAP/Fund axes, Plotly engine, OI size, 5m poll, $5M vol, min |z| 1.
High extension (|z| ≥ 2)
Intraday 2D/5D, min |z| 2, 5m poll.
Deep liquidity ($50M+ vol)
LogVol/Opp, $50M vol floor, sector color, OI size, 15m poll.
Crowded cluster
Cluster = Crowded position, intraday 2D/5D, $5M vol.
Diverging quadrant
Quadrant = Diverging, intraday 2D/5D, min |z| 1.
Watchlist strip (under presets)

Add pushes the Symbol field (or typed equivalent) to the watchlist. Majors / L1s add bundles. watchlist only restricts the scatter to WL symbols. WL syncs with rank ★ column and Portfolio.

Support bundle: in the browser console, __viridiaDebug.log() or await __viridiaDebug.copy() for axes, sample row, truth health, and order-book stress snapshot.

KPI row & session strip

KPIs summarize the current filtered universe on Market:

  • Shown — count after chart-level filters.
  • Above / Below both VWAPs — counts vs prior snapshot; window length from Settings → Stats compare.
  • ±2σ Extended — |primary z| ≥ 2.
  • Mean |extension| — average |primary z|.
  • Mean opportunity / funding / OI Δ24h — cross-sectional means.

Session strip (under KPIs): workflow summary—opportunity character, caution mode, ready now, upgrades, deteriorations, invalidations, shortlist execution/governance quality, set warnings. Same backend payload powers Desk queues.

Market tab — chart, selected, rank table
Scatter, zoom & legend

Hover for tooltip; click to focus symbol and open context for the drawer. Use − / + / Reset to zoom the canvas. Tickers legend lists highlighted symbols. Plotly engine replaces the canvas when selected for VWAP×funding style layouts.

BTC factor & Selected panels

BTC factor compares the focused alt to BTC (β-style read, residual, stretch alignment). Selected shows live snapshot metrics: funding, OI, liquidation bucket, cascade, microstructure, opportunity, etc. Footnotes cover OI notional vs 24h volume and client-side anchors for Δ fields.

Rank table — toolbar filters
  • Search — ticker text filter.
  • Top N — cap visible rows (25–300).
  • Min opportunity — floor on composite score.
  • Only ±2σ — |primary z| ≥ 2.
  • Quadrant / Cluster — same semantics as left column (table-local).
  • Primary only — restrict to BTC / ETH / SOL.
  • Watchlist — only WL symbols.
Rank table — column reference
Rank
Server opportunity ordering for the current snapshot.
Watchlist toggle; synced with API + rail.
Z (2D) / Z (7D)
Rolling VWAP z on 15m bars (~2 calendar days vs ~7).
Z (1D·20)
20×1d anchored daily VWAP z (swing context).
Funding rate
Current interval rate (as shown per exchange).
Fund %ile(30d)
Where today’s rate sits vs trailing month.
Fund trend
Short-horizon funding drift label.
Silent OI
OI +4h >10% while 15m base volume vs prior 4h <−20% (quiet tape, building positions).
RSI 15m
14-period Wilder RSI on 15m closes.
RSI ×-sec
Cross-sectional percentile vs universe median (decile read).
Volume (24H, $M)
Notional turnover.
Microstructure score
Execution / liquidity quality-style score.
Opportunity score
Composite 0–1 scanner score.
Liq 1m ($)
Forced liquidations in the configured time bucket (header tooltip shows bucket; server may allow POST to change minutes when authenticated).
Cascade
Latest bucket vs prior history — liquidation cascade alert state.
Cluster
Microstructure cluster assignment.
Ticker row badges (R → C → T → G → B → A)

Order is fixed (not sorted):

R
Readiness — Now / Near / Watch / Info / NoAct.
C
Conviction — elite → avoid.
T
Trust — 0–100% data quality.
G
Governance — signal family state.
B
Basket role — core, diversifier, satellite, hedge, redundant.
A
Attention — 0–100 desk priority blend.
Order book tab — L2 stress

Binance USD-M depth snapshot: KPI strip (symbol coverage, walls, avg spread bps, avg bid skew), stress spectrum chart (imbalance near touch, ±1% band), bid-heavy and ask-heavy leader tables, and a sortable universe grid (spread, imbalance, Δ over 5 refreshes, momentum, liquidity bands, wall flag). Green/red follow bid/ask semantics. Data prefers the cached stress payload; otherwise L2 fields on opportunity rows. Chart redraws when this tab is active.

Portfolio tab — cards & correlation

Portfolio set: Watchlist (if empty, desk shortlist when present) or Top 25 by server rank among rows passing current Market filters. Book ($ total) scales hypothetical equal-weight notionals on cards.

Sort: A–Z, opportunity, |Z| primary, funding, Liq 1m. Load 1h sparks forces hourly kline refresh (~96 bars, chunked; auto-refresh ~2 min while tab is open). Open Market tab returns to the main view.

Correlation matrix (ρ) uses aligned 1h log-returns when all symbols have hourly data; otherwise the note explains what’s missing. Expand ρ correlation table for the N×N grid—Focus asset highlights a row/column; Emphasis filters heatmap vs focus slice vs strong/weak links.

Heatmap tab — sector treemap

Treemap tiles sized by OI or 24h volume, colored by 1h return, 24h ticker %, opportunity, or |Z| primary. Filters: sector Group, Search, min vol, min opportunity, min |Z|. Click a tile for the same symbol drilldown drawer. Optional universe / leader strips may appear when the backend sends enriched snapshot fields.

Desk tab — deployable table & workflow

Main table: top 30 deployable names (from SCANNER_DESK_RANK_LIMIT in .env, default 30—restart server after change). Columns: deployable rank, ★, symbol, Why it matters, Change (lifecycle), Cluster. Sort by clicking headers (deployable preset). Row badges match Market.

Focus / workflow queues
  • Immediate review — needs attention now.
  • Execution candidates — actionable deployable set.
  • Watchlist candidates — track but not yet sized.
  • Fresh upgrades — improving thesis quality.
  • Thesis deterioration / Recent downgrades — weakening evidence.
  • Invalidated ideas — thesis broken.
  • High-risk fragile — thin trust or execution.

Click any symbol to open the detail drawer.

Shortlist actionability

KPI strip: style bias, execution quality, governance quality, crowding, regime fit, correlation/redundancy. Warnings call out set-level risks. Lists: Deployable, Diversified, Concentrated, High-trust shortlists for quick scanning.

Alerts tab — subscriptions, tests, history
Subscription card

Per-symbol rules cover opportunity score, |z|, funding extremes, OI, timeframe alignment, cascade, etc. Extension z selector: 2D VWAP vs Daily VWAP (20d) for alert logic. Regime-style broadcasts use your first saved subscription for channel routing. Telegram bot token / SMTP live in server .env.

Test dispatch

One-off Telegram / Discord ping using production paths; requires tokens/webhooks on the server.

Saved subscriptions

Filter list, inspect channels, remove rows.

Outcome accuracy

Per-condition stats for 7d / 30d / 90d windows (eval count, win%, average favorable vs adverse move).

Recent fires (Postgres)

Filter by text and priority; limit rows; optional Auto-refresh 30s. Populates audit trail used alongside drawer recent alerts.

Watchlist rail

Slide-out panel from the star toggle: add/remove symbols, Majors / L1s, jump to Portfolio, search, sort (A–Z / Opp / |Z|). Checkboxes mirror watchlist only on the chart and the rank table WL filter. Copy list / Clear all at the bottom. ◇ on a row focuses that symbol on Market.

Symbol detail drawer — every section

Open from chart, tables, heatmap, desk lists, or WL. Actions: add/remove watchlist, copy contract, jump to Market. Close with ×, overlay click, or Escape.

Operator strip
Top-line desk/readiness context for the symbol.
Thesis summary
Setup class, signal family, bias, conviction, why it matters, risk flags.
Playbook
Style, entry approach, urgency, execution fragility, confirms / weakens, invalidation hints.
Scenario map
Bull/base/bear style outcomes with cues.
Monitoring
Structured triggers from monitoring_triggers when drilldown provides them.
Trust / provenance
Trust score, governance, global truth mode, scanner caution, data uncertainty, warnings.
Shortlist context
Basket role, regime fit, redundancy vs diversification, lifecycle, review/attention, change summary.
Diagnostics (collapsible)
  • Funding (last settlements) — chart + summary line below (no overlap with OI block).
  • OI change
  • Order book depth (L2)
  • Signal alignment (timeframe / funding context)
  • Recent alerts (this symbol) — load Alerts history for fuller audit
  • Quick backtestPOST /api/scanner/backtest/run then poll GET /api/scanner/backtest/{job_id}; drawer shows Submitted + Status JSON and a short summary (errors, bar counts, hints).
Settings page (/ui/settings)

Separate page (header link or profile menu). Save Changes persists local preferences and POSTs profile / optional liquidation-bucket API when configured.

Profile
Display name, email, avatar URL; loads from /api/auth/profile when token present.
Preferences
Dark/light, accent palette, Pro/Standard visual mode, stats compare window (drives KPI deltas), tooltips, default view label, currency display, auto-refresh toggles, refresh interval, default min vol ($M), default alert z.
Security
Password / 2FA placeholders (wire to your auth provider as implemented).
Integrations
Supabase status line, Bearer token storage for API calls, default Telegram chat id, exchange key hints (live keys remain in server env for ingestion).
Notifications
Deviation / email toggles (UI state; server rules still govern delivery).
API Status
Health poll from /health.
Persistence (localStorage keys)

Non-exhaustive: scanner_refresh_interval, scanner_analysis_mode, scanner_pref_min_vol, scanner_pref_alert_z, scanner_wl_*, scanner_portfolio_book_usd, scanner_stats_compare_hours, scanner_alerts_auto_refresh, scanner_theme, scanner_accent_theme, scanner_visual_mode, scanner_info_tips, profile fields, scanner_token.

Scan method — VWAP windows & methodology notes

VWAP z-scores use anchored rolling windows on 15m bars (e.g. 2D, 5D, 7D). Intraday mode treats 2D z as primary for filters and “extension”; Swing uses 7D. Axis presets map to 2D/5D, 5D/7D, 2D vs prior week, 2D vs weekly anchor, or VWAP z vs funding (leverage crowding read—interpret with regime context).

Original methodology notes (archived)
Scans all Binance assets. Creates a z-score dot plot with standard deviations: 1. Started with a 2D/5D Rolling VWAP Comparison . This is quick to interpret at a glance and provides general market context in the broad sense. However, since the two are a bit too closely correlated for my liking I started adding more layers. 2. Included a 2D Rolling VWAP/ Prior Week Value with the goal of answering the question: "is the price extension genuine on two independent windows?" Provides a bit more statistical confirmation for mean-reversion (depends on regime vol and periodicity ofc) 3. Then moved to a 2D Rolling VWAP/Current Week VWAP comparison. "what does the week look like for each asset?" This would be best used towards the end of the week. Thursday or Friday when there's enough weekly data to make the comparison against developing weekly value meaningful. 4. I thought of wanting to have an additional view with two structurally independent axes. This is where I decided to use VWAP/Funding to get a look at where there might potentially be leverage risk i.e. price extension as well as overcrowded positioning. On it's own without understanding of underlying mechanism, this could be dangerous because positioning can remain overcrowded for a while (especially if you don't understand how a strong trending regime works) however if you know what you're looking for I believe it's a good starting point to quickly scan for a watchlist. Additionally, added some toggles for scaling the dots using OI as well as 24H volume, sector coloring, ability to create a watchlist, set alerts when exceeding x standard deviation, simple backtest for specific assets, showing above/below assets only as well as tabulated data under the table.