Skip to content

Releases: simonro/Trading-Journal-AI

v1.3.3 - Empty installs, safe demo seed

Choose a tag to compare

@simonro simonro released this 18 Sep 16:50

Every install starts empty, and the demo seed can no longer overwrite your journal.

Not financial advice. Not a signal service. Every screenshot is the synthetic demo seed.

A new install has no data

A new install, whether from the ZIP, a git clone or setup.bat, starts with no accounts, no trades and no demo data. Setup and the README no longer suggest loading the demo data. Add an account, then import your broker's statement.

Fixed: the demo seed could delete your database

scripts/seed_demo.py builds the synthetic data used for the screenshots. It deleted any existing backend/trading_journal.db without asking, so running it after importing real trades would have wiped them. It now refuses when a database exists and changes nothing, unless you pass --replace-database. It is documented as a development tool only.

Also

  • Questions now go to Discussions; Issues are for bugs, feature requests and broker importer requests.
  • main is protected: a pull request merges only when the backend tests and the frontend build pass. Dependabot alerts and security updates are on.

Install

Download the zip below, unzip it, run setup.bat, then launch.bat. Python 3.11 or newer and Node 18 or newer.

Upgrading

Your trades (backend/trading_journal.db) and your keys (backend/.env) are not part of a release, so updating never touches them.

If you cloned with git: git pull, then launch.bat.

If you downloaded the ZIP: unzip this one into a new folder, copy your two files across, run setup.bat once, then start it with launch.bat.

old-folder/backend/.env                 ->  new-folder/backend/.env
old-folder/backend/trading_journal.db   ->  new-folder/backend/trading_journal.db

v1.3.2 - Re-import fix, one-step Windows setup, CI

Choose a tag to compare

@simonro simonro released this 18 Sep 16:16

A fix for re-imports that could lose a trade, an easier Windows install, and a repository set up for contributors.

Not financial advice. Not a signal service. Every screenshot is the synthetic demo seed.

Fixed: a second import could overwrite a trade

Each import numbers a ticker's round trips for the day from 1 (_1, _2). Importing a statement for a day that already had trades, for example a mid-day export followed by the end-of-day one, numbered the new fills from 1 again and replaced the stored trade with that name. A whole round trip could disappear, and a trade could be left holding only its entries or only its exits.

The importer now rebuilds that ticker's day from the fills already stored plus the new ones, so every round trip comes out whole. Notes and tags stay with the trade they belong to. This applies to Thinkorswim, IBKR and the generic template.

If you imported the same day more than once, import that day's statement again after updating. The day is rebuilt correctly and nothing is duplicated.

Easier install on Windows

setup.bat checks for Python and Node, creates the Python environment, installs both halves of the app and creates backend\.env for your optional keys. Installing is now setup.bat once, then launch.bat.

Checked on every change

  • A CI workflow runs the backend tests, the frontend tests and a production build on every push and pull request. The badge is on the README.
  • New tests check the Thinkorswim and IBKR importers against the sample statements, with the expected P&L worked out by hand: a scale-in, partial exits, a short, a loser, a multi-day round trip and an open position. 23 backend and 19 frontend tests in all.
  • axios is upgraded to 1.17 for its security fixes.
  • About 300 lines of dead code left over from the 1.2.0 redesign are removed, including a dashboard request whose result nothing used.

For contributors

CONTRIBUTING.md (setup, tests, how to add a broker importer), a code of conduct, SECURITY.md with private vulnerability reporting, and templates for bug reports, feature requests, broker importer requests and pull requests. The README now opens with what the journal does and what stays on your machine.

Install

Download the zip below, unzip it, run setup.bat, then launch.bat. Python 3.11 or newer and Node 18 or newer. A new install starts empty: add an account, then import your broker's statement.

Upgrading

Your trades (backend/trading_journal.db) and your keys (backend/.env) are not part of a release, so updating never touches them.

If you cloned with git:

git pull
setup.bat
launch.bat

If you downloaded the ZIP: unzip this one into a new folder, copy your two files across, run setup.bat once, then start it with launch.bat.

old-folder/backend/.env                 ->  new-folder/backend/.env
old-folder/backend/trading_journal.db   ->  new-folder/backend/trading_journal.db

v1.3.1 - Day Review measures against all time

Choose a tag to compare

@simonro simonro released this 14 Sep 23:27

Day Review measures, each set against your all-time record.

Not financial advice. Not a signal service. Every screenshot is the synthetic demo seed.

What changed

  • Exit efficiency for the day, beside your all-time figure, so a day that left money on the table shows it.
  • Avg per trade, the day's net divided by its trades, beside your all-time expectancy.
  • Profit factor on a day with no losing trades reads "No losers" instead of a dash.
  • The separate "vs all-time" row is gone. Every measure carries its own all-time figure and the difference, in two rows of four. Net for the day compares with your average day.
  • "Best in the day" is folded into Given back: "From a session high of ...".

Fixed

  • The old comparison row treated a missing profit factor as zero, so a day with no losers printed a false red drop against your average.

Install

Download the zip below, unzip it, then follow the Quick Start in the README. Python 3.11 or newer and Node 18 or newer. Run python scripts/seed_demo.py for the synthetic data in the screenshots.

Upgrading

Your trades (backend/trading_journal.db) and your keys (backend/.env) are not part of a release, so updating never touches them.

If you cloned with git:

git pull
launch.bat

If you downloaded the ZIP: unzip this one into a new folder, copy your two files across, run npm install in frontend/ once, then start it.

old-folder/backend/.env                 ->  new-folder/backend/.env
old-folder/backend/trading_journal.db   ->  new-folder/backend/trading_journal.db

v1.3.0 - Import from any broker

Choose a tag to compare

@simonro simonro released this 13 Sep 13:49

Import from any broker, not just Thinkorswim and Interactive Brokers.

Not financial advice. Not a signal service. Every screenshot is the synthetic demo seed.

Generic CSV import

If your broker is not one of the two with a dedicated importer, copy your fills into the generic
template, one row per execution, and import it with Other broker (generic template). The journal
groups the fills into round-trip trades using the same code the broker importers use, so duplicate
detection and P&L behave exactly the same.

On the Import page, Broker not listed? links a blank template and a filled-in example: a long
with a partial exit, a short, an option and a micro future.

Column Needed What goes in it
date Required YYYY-MM-DD, or MM/DD/YYYY
time Required 24 hour HH:MM or HH:MM:SS, or 1:05 PM
symbol Required AAPL. Futures start with a slash: /MESU26
side Required BUY or SELL. BUY TO COVER, SELL SHORT, BOT and SOLD work too
quantity Required Shares or contracts, always positive
price Required Fill price per share or per contract
commission Optional Fees for that fill. Blank means 0
asset_type Optional STOCK (the default), OPTION or FUTURE
expiry, strike, put_call Options 2026-08-28, 765, CALL or PUT
multiplier Optional Point value for a future the app does not know

Columns can be in any order, common names such as Ticker, Qty and Fees are recognised, and
extra columns are ignored, so an export that already uses these headers imports without editing.
Auto-detect recognises the template.

It refuses rather than guesses. If any row cannot be read, nothing is imported and the error
names the line and the problem. Day-first dates are refused because 03/04 is ambiguous, and a
future with an unknown point value is refused unless the row has a multiplier, because assuming 1
would understate an /ES trade fifty times over. A silently skipped or mispriced fill would change
every P&L figure after it.

Also in this release

  • Demo trades are priced at each day's real closing level, so with market-data keys set the trade
    chart shows real candles with the fills sitting on the actual price action. The trades themselves
    are still entirely synthetic.
  • Without market-data keys, the chart area was a tall empty box on every trade. It is a single line
    now.
  • Trade View still told you to click a row to expand it; the expand was removed in 1.2.0. The copy
    is corrected.
  • backend/tests/test_generic_csv.py: 13 tests covering each instrument type's P&L and every refusal
    path. scripts/capture_screenshots.py retakes the README screenshots.

Want a dedicated importer for your broker?

Open an issue with a sample export that has account numbers and personal details removed. Every
parser only has to turn rows into executions; grouping, duplicate detection and P&L are shared.

Install

Download the zip below, unzip it, then follow the Quick Start in the README. Python 3.11 or newer
and Node 18 or newer. Run python scripts/seed_demo.py for the synthetic data in the screenshots.

Upgrading

Your trades (backend/trading_journal.db) and your keys (backend/.env) are not part of a release,
so updating never touches them.

If you cloned with git:

git pull
launch.bat

If you downloaded the ZIP: unzip this one into a new folder, copy your two files across, run
npm install in frontend/ once, then start it.

old-folder/backend/.env                 ->  new-folder/backend/.env
old-folder/backend/trading_journal.db   ->  new-folder/backend/trading_journal.db

v1.2.0 - The whole app redesigned

Choose a tag to compare

@simonro simonro released this 12 Sep 21:40

The whole app was redesigned, not recoloured. Plus the fixes found while doing it.

Not financial advice. Not a signal service. Every screenshot is the synthetic demo seed.

The dashboard opens on a live curve

Your net P&L sits over the equity curve itself. Hover anywhere on it for that day's running balance
and what the day made or lost.

Under it, every session in the period is a single strip, one bar per trading day, gains above the
line and losses below. Scrub it with the mouse and the readout follows; click a bar to open that
day. Nine months of behaviour in about sixty pixels.

Measures that say what they mean

Each measure carries your own goal as a tick mark rather than a progress bar, and a plain-language
read underneath. "Win / loss size 0.66" now also tells you: your average win is $337, your average
loss is $508, you win often and small and lose rarely and big.

Day Review draws the session

The day is one picture: running P&L from the open to the close, with every trade marked where you
entered it. An afternoon giving back a morning is visible before you read a number. The measures
line underneath reports the session's high water mark and how much of it you handed back.

Each trade's grade now carries the reason it was given, reachable by hover, by keyboard focus, or by
clicking it.

The discipline score is gone. It has been replaced by "rule breaks", counted from what actually
happened rather than from a score.

One switch for the whole of Reports

Bars or full numeric tables, flipped for every breakdown on the page at once. Rows with fewer than
ten trades are marked "thin" and dimmed, so a one-trade strategy at 100% cannot sit above a
strategy with eighty trades behind it.

Elsewhere

  • A trade row opens the trade. The in-place expand is gone; it showed a subset of the detail page.
  • The calendar gains "The year behind it": every month with its running balance carried forward.
  • MFE, MAE and exit efficiency appear anywhere a trade is listed, including the trade's Stats tab.
  • The month grid and Day Review open on your most recent session rather than on today, which is
    blank on a weekend or before the open.

Fixes

  • The goals you set were never reaching the dashboard. The cards read the wrong field names, so
    every goal silently fell back to a default and a saved change never appeared.
  • Equity curves were drawn in the accent colour rather than the result colour.
  • A profit factor with no losing trades displayed as infinity. It is a dash: no losses means no
    measurable edge, not an infinite one.
  • seed_demo.py never created the library tables, so a freshly seeded database returned 500 from
    the Settings endpoints until the server was restarted.
  • Asking for a day review without an API key returned a 500 with a raw exception. It now tells you
    which key to set.

The demo data

Reshaped to look like a real discretionary record rather than a coin flip: 278 trades over 52
sessions, a 70.9% win rate, 77% green days, a 1.6 profit factor, and winners that are smaller than
the losers so exit discipline is the visible weakness. The overtrading days and the losing week are
still in there, because catching those is what the journal is for. Six day reviews are seeded, so a
fresh clone shows the coaching report instead of an empty page.

Install

Download the zip below, unzip it, then follow the Quick Start in the README. Python 3.11 or newer
and Node 18 or newer. Run python scripts/seed_demo.py for the synthetic data in the screenshots.

Upgrading from v1.1.x

Your trades (backend/trading_journal.db) and your keys (backend/.env) are not part of a release,
so updating never touches them.

If you cloned with git:

git pull
cd frontend && npm install && cd ..
launch.bat

If you downloaded the ZIP: unzip this one into a new folder, copy your two files across, run
npm install in frontend/ once, then start it.

old-folder/backend/.env                 ->  new-folder/backend/.env
old-folder/backend/trading_journal.db   ->  new-folder/backend/trading_journal.db

v1.1.1 - Works on any localhost port

Choose a tag to compare

@simonro simonro released this 12 Sep 13:02

A single fix: the app failed to load when it was not on port 3010.

The bug

launch.bat offers the next free port when 3010 is taken, so the frontend can end up on 3011 or
higher. The backend only advertised http://localhost:3010 as an allowed origin, so the browser
discarded every response and the app showed "Could not load the dashboard: Network Error", with
nothing wrong on the server side.

The fix

The backend now accepts any localhost or 127.0.0.1 port. That is safe because it only ever runs
on your own machine. FRONTEND_ORIGINS still exists, and is now only needed when the frontend is
served from another host, for example another machine on your LAN.

No other change: same features, same database, same schema as v1.1.0.

Install

Download Trading-Journal-AI-v1.1.1.zip below, unzip it, then follow the Quick Start in the README.
You need Python 3.11 or newer and Node 18 or newer.

Upgrading from v1.1.0 or v1.0.0

Your trades (backend/trading_journal.db) and your keys (backend/.env) are not part of a release,
so updating never touches them.

If you cloned with git:

git pull
launch.bat

If you downloaded the ZIP: unzip this one into a new folder, copy your two files across, run
npm install in frontend/ once, then start it.

old-folder/backend/.env                 ->  new-folder/backend/.env
old-folder/backend/trading_journal.db   ->  new-folder/backend/trading_journal.db

Coming from v1.0.0? Read the v1.1.0 notes
as well: that is the release with the redesign, the Settings name library and the Sources and Tags
report.

v1.1.0 - Redesign, Settings library, Sources & Tags

Choose a tag to compare

@simonro simonro released this 12 Sep 12:39

Get v1.1.1 instead.
This build only works when the frontend is on port 3010. If launch.bat moves it to 3011,
the app shows "Network Error". v1.1.1 is this release plus that fix.

A new look and two features that came out of using it every day: one place to clean up the names
the journal collects, and a report that scores where your ideas actually come from.

Not financial advice. Not a signal service. Every screenshot is the synthetic demo seed.

New look

The sidebar is gone. Every page now sits in a compact header, so Dashboard, Trade View, Calendar,
Day Review, Reports, Diary, Help and Settings are one click away, with Brain, the account selector,
Import and Add Trade always visible. The whole app moved onto a token-based dark palette with
tabular numbers, and red and green now mean won or lost, never long or short.

Nothing was removed and no calculation changed.

Settings: the name library

Diary analysis invents names. After a few months you have "1Option", "OneOption" and "1option", or
three spellings of the same setup, and your reports quietly split in three.

Settings gives you one page for strategies, sources and tags. Rename them, merge duplicates, or
delete one and reassign its trades. A merge rewrites every trade that used the old name and
remembers it, so the next diary analysis that produces that duplicate saves it under the name you
kept.

Reports: Sources & Tags

A new tab scoring every source (where the idea or alert came from) and every tag type: setup,
execution, mistake, emotion and outcome. Trades count under each of their tags, so those rows show
how a habit performs rather than adding up to your net P&L.

Charts that open where you are looking

  • 1m to 15m open on the trade day's session, 9:30 to 16:00
  • 30m and 1H open on the last month, Daily and Weekly on the last year
  • Earlier days load when you zoom or pan past the first bar, not on a window resize
  • Legend entries switch Buy fill, Sell fill, VWAP, SL and Target on and off
  • VWAP restarts each session instead of averaging across every loaded day

Fixes

  • Recording an exit takes a real date, time and fees. It defaults to today, refuses an exit dated
    before the last fill, and refreshes the dashboard afterwards
  • Open Positions shows the quantity still open, not the quantity originally entered
  • A failed load keeps the page and its filters, and offers Retry
  • Deleting a diary entry that had produced AI analyses no longer fails; the analyses stay on the trade
  • Slow responses can no longer overwrite a newer account or date selection

Accessibility

Visible focus everywhere, tab lists that move with arrow keys, keyboard-operable rows and calendar
days, focus handling in dialogs, labelled inputs, scroll cues instead of hidden columns, and reduced
motion respected.

Also

  • FRONTEND_ORIGINS lets the backend accept a frontend served from another port
  • 19 integration tests covering the pages, the account menu, the Settings flows and the alerts

Install

Download Trading-Journal-AI-v1.1.0.zip below, unzip it, then follow the Quick Start in the README.
You need Python 3.11 or newer and Node 18 or newer. A clean install stays clean; run
python scripts/seed_demo.py if you want the synthetic data from the screenshots.

Upgrading from v1.0.0

Your trades (backend/trading_journal.db) and your keys (backend/.env) are not part of a release,
so updating never touches them. The two new tables are created on first start and nothing existing
is migrated or rewritten. Back up the database first anyway: it is a single SQLite file, so copying
it somewhere safe is the whole backup.

If you cloned with git:

git pull
pip install -r backend/requirements.txt   # only if requirements changed
cd frontend && npm install && cd ..       # only if package.json changed
launch.bat

If you downloaded the ZIP: unzip this one into a new folder, copy your two files across, then
run npm install in frontend/ once and start it:

old-folder/backend/.env                 ->  new-folder/backend/.env
old-folder/backend/trading_journal.db   ->  new-folder/backend/trading_journal.db

v1.0.0

Choose a tag to compare

@simonro simonro released this 06 Sep 23:59

An AI-powered trading journal you run locally on your own machine. Import your broker's CSV and
the journal groups executions into round-trip trades, tracks your KPIs, and uses Claude to analyze
your diary, grade your days, and answer questions about your own data.

Not financial advice. Not a signal service. All data in the screenshots and seed is synthetic.

What's inside

  • Dashboard: P&L curve, KPI gauges against your goals, calendar heatmap
  • Trade View: executions, playbook setup tags, MFE/MAE, exit efficiency, intraday chart
  • Reports: day of week, time of day, hold time, setup, grade, symbol, side, emotion
  • Diary: upload handwritten notes or screenshots, Claude extracts stops, R-multiples and mistakes,
    then matches them to your actual trades
  • Day Review and Weekly Summary: coaching reports graded on process, not just P&L
  • Brain: chat against your full trading history
  • Import: Thinkorswim and Interactive Brokers (IBKR) CSV, with a broker dropdown

Install

Download Trading-Journal-AI-v1.0.0.zip below, unzip it, then follow the Quick Start in the
README. You need Python 3.11 or newer and Node 18 or newer. A clean install stays clean, no demo
trades are seeded by default.

You can also clone the repo instead if you would rather track updates with git.

Notes

  • Requires your own Anthropic API key for the AI features. The README has a ready-to-paste prompt
    for adding it. Copy .env.example to backend/.env and fill it in.
  • The chart proxy defaults to the Alpaca iex feed so a free Alpaca account works.
  • Runs on ports 8010 and 3010 so it will not collide with another local journal.
  • MIT licensed, free, no email required.

Walkthrough video: https://www.youtube.com/watch?v=LTR4HOfS_hc