[ platform · dashboard ]

Portfolio dashboard

Your home base. Shows live positions, cumulative return chart, risk-return scatter, top winners/losers, and an always-on PM chat. This is the page you'll have open during a trading session.

Overview

The dashboard composes data from three sources: the active broker (positions + buying power), the audit ledger (decisions + orders), and the optimization engine (suggested target weights). Refresh cadence is 5 seconds for live broker state, on-demand for analytics.

Panel by panel

Header strip

Account state across the top. From left to right:

Positions table

One row per non-zero position. Columns: symbol, shares, avg entry, last, mark, P&L $, P&L %. Sort by any column. Filter via the search box (substring match). Click a row to open the symbol's Research workbench tab.

Cumulative return chart

X-axis = time, Y-axis = % return from inception. Series shown:

If there are no fills in the visible window (fresh account or weekend after a Friday submit), the chart renders flat with a note telling you what happened — not empty/blank.

Risk-return scatter

Each point is one symbol you hold. X = realized annualized vol over the last 60 trading days. Y = annualized return. Bubble size = position $ value. Click a bubble to focus the cumulative chart on that name.

Embedded PM chat

Bottom-right panel. Routes through Kimi K2.6 by default (configurable via CHAT_MODELS). 20 registered tools — order placement, backtest runs, sleeve compare, Setup Wizard, etc. See PM chat.

Triggering a rebalance

Click Rebalance → in the header. The modal opens:

  1. Pick a sleeve (Core/Sat/Tac).
  2. Review the optimizer's proposed weights (cuFOLIO solve, ~520 ms).
  3. Compliance section shows hard/soft/warn vetos. Anything red blocks submit.
  4. Three actions:
    • Approve — submits orders to the active broker. Each order is logged with broker order id + rationale.
    • Override — kills submit; logs your reason as a training signal for the DPO flywheel.
    • Reject — kills submit; logs as "didn't like this whole plan."

Every choice writes to data/audit/rebalance_decisions.jsonl, the source of truth for the preference learning flywheel.

How to interpret what you see

signallikely causeaction
Cumulative chart is flatNo fills in windowCheck Orders — pending vs filled.
Day Δ ≠ broker siteOut-of-hours mark vs intradayReload after market open.
Buying power vs cash mismatchMargin accountExpected; 2× cash for Alpaca paper.
Rebalance modal redCompliance hard vetoRead the rule that fired; either edit sleeve config or accept and override.

Customize the dashboard

Per-tenant theming sits at Account → Tenant theme. Logo, primary/accent colors, custom CSS — all injected site-wide via the shared auth.js bootstrap. The dashboard layout itself is in mockups/dashboard.html; chart series colors honor the tenant accent.

To add a panel, drop another <section> into dashboard.html and wire its data via fetch('/api/<your-endpoint>'). The Tailwind utility classes + the panel/panelHi/border color tokens keep new panels visually consistent.

REST surface

VerbPathPurpose
GET/api/portfolio/stateEquity, day Δ, buying power, cash, positions, active broker.
GET/api/portfolio/equity?since=ISOCumulative return series for the chart.
GET/api/portfolio/risk_returnPer-holding vol+return for the scatter.
POST/api/portfolio/rebalanceReturns optimizer plan + compliance verdict.
POST/api/portfolio/decisionApprove/Override/Reject — writes audit + (optionally) submits orders.
NVTrader v0.1.18 · docs ·⚠ Not financial advice ·Docs home ·App