Changing these values will recompute realised P&L and holding days on save. Entry fields are locked for closed positions.
Positions
Loading positions…
Total Deposited
—
Total Withdrawn
—
Total Dividends
—
Net Capital
—
Capital Event
Dividend Event
Default 15% for foreign ETFs · 0% for domestic
Remember to update share count on this position
Capital Events
Loading…
Dividend Events
Loading…
Transaction HistoryAll events · most recent first
Loading…
Performance
Total Return %
—
True Return % Net of deposits
—
Annualised Return %
—
Best Position
—
Worst Position
—
Total Realised P&L Closed trades
—
Closed Trades
—
Quadrant Exposure
Load positions and prices to see exposure.
Position Concentration
Loading…
Dividend Income
Net Dividends Received
—
Gross vs Net
—
Est. Annual Yield
—
Dividend Events
—
No dividend data.
Settings
Connection Status
Supabase — not tested
Supabase
Polygon.io
Portfolio
Sanity-check reference only. Live portfolio value is calculated from capital events + positions.
Database Setup — SQL Schema
Run the following SQL in your Supabase project's SQL Editor to create the required tables.
-- Positions table
CREATE TABLE IF NOT EXISTS positions (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
created_at timestamptz NOT NULL DEFAULT now(),
ticker text NOT NULL,
entry_date date NOT NULL,
entry_price float NOT NULL,
shares float NOT NULL,
quadrant text,
tranche int,
notes text,
active boolean DEFAULT true,
commission float DEFAULT 0,
exit_commission float DEFAULT 0,
exit_price float,
exit_date date,
realized_pnl float,
holding_days integer
);
-- Capital events table
CREATE TABLE IF NOT EXISTS capital_events (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
date date NOT NULL,
amount float NOT NULL,
type text NOT NULL,
notes text
);
-- Dividend events table
CREATE TABLE IF NOT EXISTS dividend_events (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
date date NOT NULL,
ticker text NOT NULL,
amount_per_share float NOT NULL,
shares_held float NOT NULL,
gross_received float NOT NULL,
withholding_rate float DEFAULT 0,
net_received float,
reinvested boolean DEFAULT false,
notes text
);
-- Migration: add commission columns to positions (safe to re-run)
ALTER TABLE positions ADD COLUMN IF NOT EXISTS commission float DEFAULT 0;
ALTER TABLE positions ADD COLUMN IF NOT EXISTS exit_commission float DEFAULT 0;
-- Migration: update dividend_events for withholding (safe to re-run)
ALTER TABLE dividend_events RENAME COLUMN total_received TO gross_received;
ALTER TABLE dividend_events ADD COLUMN IF NOT EXISTS withholding_rate float DEFAULT 0;
ALTER TABLE dividend_events ADD COLUMN IF NOT EXISTS net_received float;
-- Migration: add realised P&L tracking on position exit (safe to re-run)
ALTER TABLE positions ADD COLUMN IF NOT EXISTS exit_price float;
ALTER TABLE positions ADD COLUMN IF NOT EXISTS exit_date date;
ALTER TABLE positions ADD COLUMN IF NOT EXISTS realized_pnl float;
ALTER TABLE positions ADD COLUMN IF NOT EXISTS holding_days integer;
Close Position
Record the exit details for . This computes realised P&L (including net dividends received during the holding period) and updates uninvested cash.