Overview

Tradiator is a trading journal and analytics platform for funded futures traders. Log trades, write daily playbook entries, track evaluation costs and payouts, analyze performance, and document strategies โ€” all in one dashboard.

๐Ÿ“Š
Performance Dashboard
Real-time equity curve, net P&L, win rate, profit factor, and best day/DOW stats.
๐Ÿ“…
Playbook Calendar
Monthly grid with daily P&L per cell. Click a day with an entry to open the full journal view.
๐Ÿ“
Daily Journal
Pre-market plan, post-session notes, mood, bias, star rating, setups, sessions, rules followed.
๐Ÿ’ฐ
Eval & Payouts Tracker
Track evaluation fees, resets, and payouts per firm. Calculates net profit and ROI.
๐Ÿ“ˆ
Insights & Analytics
By symbol, session, setup, day of week, streaks, and journal adherence stats.
๐Ÿ—‚๏ธ
Strategy Library
Document setups with entry conditions, confluences, sessions, timeframes โ€” saved per user to Supabase.

Tech Stack

Frontend
Next.js 15App Router, Server Components
TypeScriptStrict mode throughout
Tailwind CSSDark + light mode theming
shadcn/uiRadix-based component library
RechartsEquity curve chart
SonnerToast notifications
Backend & Infrastructure
SupabasePostgreSQL + Auth + RLS
VercelDeployment (Serverless + Edge)
Next.js API RoutesREST endpoints at /api/*
Supabase AuthEmail/password, JWT sessions
Row Level SecurityPer-user data isolation in DB

Roles & Access

Three user roles. All role checks happen server-side via requireRole() on every page and API route โ€” cannot be bypassed from the client.

๐Ÿ‘‘ Admin ๐Ÿ›ก๏ธ Moderator ๐Ÿ‘ค User
RoleCan DoCannot Do
adminEverything โ€” full data access, admin panel, role & plan changes, delete any accountNothing
moderatorAdmin panel (read), view all users/trades/journals, manage cooldownsChange roles, delete accounts
userOwn dashboard, trades, journal, strategies, eval, settingsAdmin panel, other users' data
Promoting your first admin After signup, run in Supabase SQL Editor: update public.profiles set role = 'admin' where email = 'you@example.com';

Plans

Users can be on free, pro, or premium. Free users see a banner. Plan is stored in profiles.plan and the subscriptions table.

Dashboard

Main landing page after login. Route: /dashboard. Shows aggregate performance stats, equity curve, recent trades, and recent journal entries.

tradiator.net/dashboard
Welcome back, Jason
Your trading overview
Today 1W 1M 3M All โœ“
Net P&L
+$54.4k
500 trades
Win Rate
58.0%
290W / 210L
Profit Factor
2.14

Stat Cards

StatCalculation
Net P&LSum of (pnl โˆ’ commission) for all trades in selected time range
Win RateCount of trades where pnl > 0 รท total trades ร— 100
Profit FactorSum of winning P&L รท absolute sum of losing P&L
Avg W / LAverage winning and average losing trade amounts
Best Day %Highest single-day net P&L as % of total P&L
Best DOWDay of week with highest average net P&L across all trades

Time Filters

Tabs across the top: Today, 1W, 1M, 3M, 6M, 1Y, All, Custom. Custom allows a date range picker. All stat cards and the equity curve respond to the active filter.

Log Win / Log Loss Buttons

Top-right on desktop (large buttons), floating pill buttons bottom-right on mobile. Log Win pre-fills direction as Long; Log Loss pre-fills as Short.

Recent Journal Feed

Right panel shows the last 3 journal entries with mood badge, title, bias, and notes preview.

Trade Logging

Every trade is stored in the trades table. Trades can be entered manually, created from the Trades page, or imported via CSV.

Trade Entry Form Fields

FieldTypeRequiredNotes
Datedateโœ…Defaults to today
Symboltextโœ…ES, NQ, MES, MNQ, CL, GC, RTY, YM, Other
DirectionLong / Shortโœ…Pre-filled by Log Win (Long) or Log Loss (Short)
Contractsintegerโœ…Defaults to 1
Entry PricedecimalโŒUsed for R-multiple calculation
Exit PricedecimalโŒUsed for R-multiple calculation
Stop PricedecimalโŒUsed for R-multiple calculation
P&Ldecimalโœ…Gross profit/loss before commission
CommissiondecimalโŒDefault 0. Net P&L = pnl โˆ’ commission
SetuptextโŒFree text, links conceptually to Strategies
SessiontextโŒLondon, NY Open, NY AM, NY PM, Asia
GradeA+/A/B/C/DโŒQuality grade for trade execution
NotestextโŒFree-text notes
AccountuuidโŒLinks to a trading account

R-Multiple Auto-Calculation

// Long
R = (exitPrice - entryPrice) / Math.abs(entryPrice - stopPrice)

// Short
R = (entryPrice - exitPrice) / Math.abs(entryPrice - stopPrice)

Trades Page โ€” /trades

Table of all trades. Supports multi-select bulk delete, inline edit via pencil icon, and click-to-detail.

Post-Trade Reflection Popup

If enabled in Preferences, a reflection dialog appears after logging any trade. Can be toggled off in Settings โ†’ Preferences.

Playbook Calendar

Route: /journal/calendar. Monthly grid where each day cell shows that day's net P&L and trade count. Green = profit, Red = loss.

tradiator.net/journal/calendar
Month P&L
+$8,420
12W ยท 4L
Win Rate
75%
16 trading days
Best Day
+$2,100
Worst Day
-$890
April 2026
Sun
Mon
Tue
Wed
Thu
Fri
Sat
1
2
3
4
5
6
+$892
3 trades
7
-$340
2 trades
8
+$1.2k
4 trades
9
10
11
+$450
1 trade
12
-$720
3 trades
13
+$1.8k
5 trades
14
+$630
2 trades
15

Cell Behavior

Cell StateAction on ClickVisual Cue
Day with journal entryNavigates to /journal/calendar/YYYY-MM-DDColored border + P&L + mood dot
Day without journal entryOpens journal entry editor dialogEmpty cell with day number only
TodaySame as above based on entry statusBlue ring border
Outside current monthNot clickable10% opacity, greyed out

Journal Day View

Route: /journal/calendar/YYYY-MM-DD. Full-page view for a specific trading day. Only reachable when a day has an existing journal entry.

tradiator.net/journal/calendar/2025-04-28
Monday ยท April 28, 2025
Bearish Bias โ€” Stayed Patient
๐ŸŸ  Bad mood Bearish โ˜…โ˜…โ˜…โ˜†โ˜† โœ“ Rules Followed ๐Ÿ“‰ -$3,220 ยท 6 trades
Pre-Market Plan
Bias is bearish. Looking for rejections at the London high for NY open shorts...
Post-Session Notes
Took 2 trades at the planned level. Two revenge trades afterward caused most of the drawdown.

All Sections Displayed

  1. Header Pills โ€” Mood, Bias, Star rating, Rules followed, Net P&L + trade count
  2. Pre-Market Plan โ€” Full text, whitespace preserved
  3. Post-Session Notes โ€” Notes written after the close
  4. Setups Traded โ€” Badge list
  5. Sessions Traded โ€” Badge list
  6. Improvement Focus โ€” One thing the trader was working on
  7. Trades Table โ€” Symbol, Direction, Contracts, Entry, Exit, Net P&L, R, Setup
โœ๏ธ Edit

Links to /journal/calendar?edit=YYYY-MM-DD โ€” auto-opens the entry editor.

๐Ÿ—‘๏ธ Delete Entry

Confirm dialog โ†’ deletes via DELETE /api/journal-entries โ†’ redirects to calendar.

Insights & Analytics

Route: /insights. All calculations happen server-side from trades and journal_entries tables on every page load.

๐Ÿ“†
Day of Week
Average P&L and trade count per weekday.
๐Ÿ•
By Session
London, NY Open, NY AM, NY PM, Asia breakdown.
๐Ÿ“Œ
By Setup
Most profitable setups and highest win rate. Top 5.
๐Ÿช™
By Symbol
Net P&L per instrument. Top 5 symbols.
๐Ÿ““
Journal Stats
Days journaled, rules followed %, avg session rating.
๐Ÿ†
Best/Worst Trade
Best and worst trade ever. Best month. Total commissions.

Computed Metrics

MetricFormula
Win Ratewins.length / trades.length ร— 100
Profit Factorsum(winning pnl) รท abs(sum(losing pnl))
Avg R-MultipleSum of r_multiple รท count of trades with r_multiple set
Best MonthMonth with highest sum(pnl โˆ’ commission)
Rules Followed %Entries where rules_followed = true รท total entries
Avg RatingAverage of journal_entries.rating (0โ€“5)

Strategy Library

Route: /strategies. Stored in the strategies Supabase table โ€” not localStorage. Scoped per user via RLS.

Strategy Fields

FieldTypeDescription
Nametext (required)e.g. "ICT OTE Long", "VWAP Reclaim"
Sessionstext[]London, NY Open, NY AM, NY PM, Asia
Timeframestext[]1m, 3m, 5m, 15m, 30m, 1h, 4h, Daily
Entry ConditionstextStep-by-step entry rules
Confluences RequiredtextConfirmation signals needed
Tagstext[]Comma-separated. Shown as #tag chips.
Colorhex string8 options. Left-border accent on card.

CRUD Flow

+ Add Strategy
โ†’
Fill modal
โ†’
POST /api/strategies
โ†’
Card appears instantly

Eval Expenses & Payouts

Route: /eval. Stored in eval_expenses and eval_payouts Supabase tables โ€” not localStorage.

๐Ÿ“ค Expenses

Types: Evaluation Fee, Reset Fee, Monthly Fee, Platform Fee, Other. Scrollable table (~10 rows), sorted newest first.

๐Ÿ“ฅ Payouts

Fields: Date, Firm, Amount, Notes. Status always shows Paid. Scrollable, sorted newest first.

Stats Cards

CardCalculation
Total ExpensesSum of all expense amounts
Total PayoutsSum of all payout amounts
Net ProfitTotal Payouts โˆ’ Total Expenses
Best MonthMonth with highest (payouts โˆ’ expenses) net
ROI on Evals(Net Profit รท Total Expenses) ร— 100

๐Ÿ† Congratulations Banner

When a payout is saved, a gold pill banner drops from the top center. Shows trophy icons, amount, and firm name. Auto-dismisses after 5 seconds.

CSV Import

Route: /import. Supports Tradovate, ProjectX/Rithmic, and Generic CSV formats.

Use the Trades report, not Fills. Tradovate's Fills export shows individual order legs โ€” use the Trades (Closed P&L) report instead for properly paired entry/exit trades.
  1. 1
    Select Platform

    Choose: Tradovate, ProjectX, or Generic.

  2. 2
    Select Account

    Pick which trading account to attribute these trades to.

  3. 3
    Paste CSV

    Paste raw CSV text into the textarea.

  4. 4
    Preview Parsed Rows

    System shows a preview table of mapped trades before import.

  5. 5
    Confirm Import

    Sends to POST /api/import-csv which bulk inserts into trades table.

No deduplication. Importing the same CSV twice creates duplicate records. Verify the trade count before confirming.

Account Settings

Route: /settings. All changes save to Supabase in real time.

TabWhat You Can Do
ProfileEdit full name. Change password (min 8 chars, must match confirmation). Email/role/plan are read-only.
AccountsAdd/edit/delete trading accounts. Types: funded, eval, live, PA.
PreferencesTimezone, default currency, language, post-trade popup toggle.
SubscriptionView plan, billing period, cancel-at-period-end status.
ThemeToggle dark/light mode. Accent color picker.
SessionsView active login sessions. Revoke individual sessions.
Danger ZoneClear All Trades (irreversible). Delete Account (all data deleted).
Danger Zone actions are irreversible. "Delete Account" deletes the auth session, profile, and all associated data via cascade delete.

API Reference

All routes under /api/* as Next.js Route Handlers. Every route verifies auth. Unauthenticated requests return 401.

Trades

MethodRouteDescription
POST/api/tradesCreate a trade. Calculates R server-side.
PATCH/api/trades/updateUpdate an existing trade
DELETE/api/tradesDelete a trade. RLS enforces ownership.

Journal Entries

MethodRouteDescription
POST/api/journal-entriesUpsert โ€” one entry per user per date
DELETE/api/journal-entriesDelete by ID

Strategies

MethodRouteDescription
GET/api/strategiesList all for current user
POST/api/strategiesCreate new strategy
PATCH/api/strategiesUpdate by ID (must be owner)
DELETE/api/strategiesDelete by ID (must be owner)

Eval Expenses & Payouts

MethodRouteDescription
GET/api/eval-expensesList all for current user
POST/api/eval-expensesCreate expense
DELETE/api/eval-expensesDelete by ID
GET/api/eval-payoutsList all for current user
POST/api/eval-payoutsCreate payout (triggers banner)
DELETE/api/eval-payoutsDelete by ID

Other

MethodRouteDescription
POST/api/import-csvBulk insert trades from CSV data
DELETE/api/delete-accountUser self-deletion

Error Format

// Success
{ data: {...} }

// Error
{ error: "Error message here" }  // HTTP 400, 401, 403, or 500

Database Schema

All tables in public schema of Supabase (PostgreSQL 15). Every table has Row Level Security enabled.

profiles

ColumnTypeNotes
iduuid PKReferences auth.users โ€” cascade delete
emailtextUnique, not null
roletextuser | moderator | admin. Default: user
plantextfree | pro | premium. Default: free
bannedbooleanDefault false
last_seentimestamptzUpdated on every authenticated page load

trades

ColumnTypeNotes
user_iduuid FKReferences profiles. Cascade delete.
trade_datedateNot null
pnlnumeric(14,2)Gross P&L before commission
commissionnumeric(14,2)Default 0
r_multiplenumeric(8,2)Calculated server-side. Nullable.
is_flaggedbooleanDefault false

journal_entries

ColumnTypeNotes
entry_datedateUnique per user_id
biastextBullish | Bearish | Neutral | null
moodtextgreat | good | neutral | bad | terrible | null
ratingint0โ€“5 stars
setupstext[]Array of setup names
sessionstext[]Array of sessions traded
rules_followedbooleanNullable

Other Tables

TablePurpose
accountsTrading accounts (funded/eval/live/PA)
strategiesUser strategy library
eval_expensesEval costs per user
eval_payoutsPayout records per user
cooldownsAdmin-placed trading cooldowns
user_settingsPer-user preferences
subscriptionsStripe subscription data
admin_logsImmutable audit log of all admin actions

Auth & Security

Authentication Flow

User signs up / logs in
โ†’
Supabase Auth (JWT)
โ†’
Trigger creates profile row
โ†’
middleware.ts refreshes session
โ†’
requireRole() on every page

requireRole() โ€” How It Works

const { user, profile } = await requireRole(["user", "moderator", "admin"]);
// 1. Gets JWT user from Supabase Auth
// 2. Fetches profile row from DB (role, banned, plan)
// 3. Checks role is in allowed array
// 4. Checks banned = false
// 5. Updates last_seen timestamp
// 6. Returns user + profile โ€” or redirects to /login

Security Summary

Admin panel properly secured. Role always read fresh from DB โ€” never from cookie or client state.
No privilege escalation possible. Admin role can only be assigned via direct SQL.
Middleware doesn't block routes at the edge. Protection is page-level only. New pages need requireRole() or they're unprotected.
No rate limiting on custom API routes. Brute force on /login is handled by Supabase Auth, but app API endpoints have none.

Test Scenarios & Checklist

Each item should pass without errors on a fresh user account unless noted.

๐Ÿ” Authentication

Sign up with a new email
Sign up with existing email (should error)
Login with correct credentials
Login with wrong password (should error)
/dashboard logged out โ†’ redirects to /login
Password mismatch โ†’ inline error
Password under 8 chars โ†’ inline error
Change password โ†’ login with new password works

๐Ÿ“Š Dashboard

Dashboard loads with stats and equity curve
Time filter changes update all stats
Log Win opens dialog pre-filled as Long
Log Loss opens dialog pre-filled as Short
New trade appears in recent trades
Recent journal feed shows last 3 entries

๐Ÿ’น Trade Logging

Log trade with all fields
Log trade with only required fields
R-multiple calculates when all prices provided
R-multiple is null when prices missing
Trade appears in Trades page table
Click trade row โ†’ opens detail page
Edit trade โ†’ changes saved
Delete trade โ†’ removed from table
Multi-select bulk delete works
Post-trade popup appears when enabled
Disable popup in settings โ†’ stops appearing

๐Ÿ“… Playbook Calendar

Calendar renders correct days
Days with trades show P&L and count
Win days green, loss days red
Today has blue ring
Stats bar updates on month navigation
Day WITH entry โ†’ journal day view
Day WITHOUT entry โ†’ editor dialog
Mood dot visible on journal days
Month navigation works
Today button returns to current month

๐Ÿ“ Journal Day View

All journal sections display
Trade table shows correct trades
W/L count and total P&L correct
Edit button opens editor with data
Delete โ†’ confirm โ†’ redirected to calendar
Deleted entry no longer on calendar
Non-existent date URL โ†’ redirects to calendar

๐Ÿ—‚๏ธ Strategies

Empty state shows prompt
Create strategy with all fields
Card shows color, sessions, timeframes, tags
Edit โ†’ changes persist after refresh
Delete โ†’ confirm โ†’ removed
Search filters by name and tag
Log out and back in โ†’ strategies present
Different user can't see your strategies

๐Ÿ’ฐ Eval & Payouts

Add expense โ†’ appears immediately
Add payout โ†’ gold banner appears
Banner auto-dismisses after 5 seconds
Click banner โ†’ dismisses early
Stats update after add
Delete โ†’ removed and stats update
Tables scroll independently >10 rows
Log out and back โ†’ all records present

๐Ÿ“ฅ CSV Import

Use Trades report (not Fills) for Tradovate
Paste CSV โ†’ preview shows parsed rows
Confirm โ†’ trades appear in Trades page
Same CSV twice creates duplicates (known)

โš™๏ธ Settings

Edit full name โ†’ persists after refresh
Add account โ†’ appears in list
Edit account โ†’ changes saved
Delete account โ†’ removed
Change timezone โ†’ saved to DB
Toggle dark/light mode
Clear Trades removes all records
Delete Account removes user entirely

๐Ÿ“ฑ Mobile

Dashboard readable on mobile
Log Win/Loss floating buttons visible
Calendar cells readable
Sidebar hidden, mobile nav visible
Discord icon next to logo
All modals usable on small screen
How to report bugs: Note the exact URL, expected behavior, actual behavior, and any console errors (F12 โ†’ Console). Include browser, device, and account email used.

Tradiator Documentation ยท For internal tester use only ยท Do not distribute publicly