Everything you need to run your journal.
From installation to advanced analytics — a complete walkthrough of indieTJ. Ten minutes from now, your trading journal will be up and running, entirely inside your browser.
Install the extension
indieTJ ships from the official extension stores only. Pick your browser:
Chrome, Brave, Edge, Arc (Chromium)
Firefox
storage — local storage for your journal data.Open your journal
On first launch the journal creates a tab for the current year and shows an empty portfolio — that empty table is your invitation to add the first position.
A quick tour of the interface
Everything lives on one screen, organized in four layers from top to bottom:
| Area | What it does |
|---|---|
| Header | Import / Export (JSON backups), CSV (spreadsheet export), API Key (live prices), and a “Saved” timestamp confirming every change was written to local storage. |
| Year tabs | One tab per trading year (2024, 2025, 2026…). + New Year creates the next one and can carry your active positions over. |
| View tabs | Portfolio — your positions table. Analytics — statistics and charts. AI Prompts — your prompt library. |
| Dashboard cards | Realized Profit, Realized Loss, Net Result, Active Capital, and Unrealized P/L for the selected year. |
Below the cards sits the toolbar — Add Position, live search, Active/Closed filter, price refresh, and sorting — and then the positions table itself.
Turn on live prices
indieTJ works fully offline, but it can fetch live market prices from Finnhub — the only external service the app ever talks to. A free key takes about two minutes:
With a key saved you get: live prices with ▲/▼ direction arrows in the table, automatic Unrealized P/L, the dashboard Unrealized card, and ticker autocomplete when adding positions. The 🔄 Refresh Prices button re-fetches everything on demand.
Add your first position
AAPL. With a Finnhub key saved, suggestions appear as you type; pick one and the field fills as AAPL — Apple Inc. Without a key, just type the name yourself in the same TICKER — Company format so live prices can find it later.Record buys and sells
Each position keeps a full transaction log. To add one, click the + button in the position's Actions column:
Click the › chevron at the left edge of a row to expand the transaction tree — the full dated history with per-line totals, a running summary, and a capital status banner. Each transaction can be edited or deleted from there.
Read the numbers: capital recovery
indieTJ doesn't track your average price the way brokers do. It tracks how much of your own money is still at risk. Three columns carry the model:
| Column | Meaning |
|---|---|
| Eff. Cost | Your own unrecovered money: invested − proceeds, never below $0. When it hits $0, the position is marked FREE — the market gave you your money back and the remaining shares ride risk-free. |
| Avg Buy | Eff. Cost ÷ remaining shares. It falls toward $0 as sells recover capital — your true break-even on what's left. |
| Realized P/L | What the shares you have already sold actually earned or lost: (sell price − average cost) × shares sold. Shares you still hold never touch this number — their fate belongs to Unrealized P/L. Shows — until your first sell, because nothing is locked in yet. |
A worked example with a fictional ticker ACME, starting from BUY 2000 @ $1.00 ($2,000 invested, cost basis $1.00 per share):
| Action | Eff. Cost | Avg Buy | Realized P/L |
|---|---|---|---|
| SELL 1000 @ $1.70 | $300 | $0.30 | +$700 |
| then SELL 500 @ $2.50 | FREE | $0.00 | +$1,450 |
After the second sell you hold 500 ACME shares that cost you nothing — that's the moment this model is built to surface.
Mkt Value — what it is worth today New in v1.0.9
The three columns above tell you what a position cost and what it earned. Mkt Value tells you what it is worth right now: remaining shares × live price, with the position's share of your whole portfolio on the line beneath. The Portfolio Value dashboard card adds it all up.
It is the fastest read on concentration — if one ticker is 60% of the book, this is where you see it. (The Analytics allocation donut answers a different question: it shows capital still at risk, so a FREE position is absent there but present here.) Needs a Finnhub API key, like everything price-driven.
Commissions — optional New in v1.0.9
Most traders round to the nearest dollar, so the fee field is hidden by default and takes up no space. If you want the exact figure, click “Add commission / fee” at the bottom of the transaction window and the field appears — and stays available for your next transactions until you hide it again.
A fee is added to your cost on a buy and subtracted from proceeds on a sell, so it flows into every number on the row: effective cost, average buy, realized P/L, and your Analytics statistics. Transactions you enter without a fee are treated exactly as before — nothing changes for you if you never turn it on.
Targets and stops
Most traders keep their exit plan in their head, or buried in a note. indieTJ gives it a proper place: open Edit Position (the ✎ button) and fill in Target Price and Stop Price. Both are optional — set one, both, or neither.
They then live directly under the live price in the table, so your plan sits next to the number that will decide it:
| What you see | Meaning |
|---|---|
| 🎯 4.50 · 🛑 2.00 | Both levels set, price between them. Muted colours — nothing to do. |
| 🎯 2.50 | Green: the live price has reached or passed your target. |
| 🎯 3.50 · 🛑 1.20 | Red: the live price has fallen to or below your stop. |
| 🎯 4.50 +69.8% | With a single level set, the distance from today's price is shown next to it. |
Hover the line for the full picture — exact levels, how far each one is in percent, and whether it has been hit. Click it to jump straight into editing. If you set nothing, the line stays invisible until you hover the row, so the feature costs you no screen space at all.
Notes: your trading memory
The Notes column is where you pin what matters: earnings dates, conference schedules, dilution risks, your exit plan. Since v1.0.7 it's a one-click editor:
Target $4.50–$5.00, trim half there.
Capital recovered — rest of position rides free.
The stock calculator
Click the 🖩 calculator button in any position's Actions column. It opens pre-filled with that position's shares and average price, and has two tabs:
Average Cost — “what if I buy more?”
Enter the planned purchase (by number of shares or by dollar amount). You instantly see the new weighted average price, total shares, total spent, current value, and P/L per share — DCA decisions with the math already done.
Profit / Loss — “what if I sell here?”
Enter shares (or a dollar amount) and a sell price. You get total buy value, total sell value, profit/loss, and return % — exit planning before you pull the trigger. A plain-language verdict line summarizes the outcome.
Position Size — “how many shares may I actually buy?”
The tab that decides whether a losing trade is a scratch or a disaster. Enter your account size and the % you are willing to risk on one trade (2% is the common default), then an entry and a stop. You get the number of shares that keeps the loss inside that budget, the position's total value, the risk per share, the dollars actually at risk, and what share of the account the position would take.
The entry price arrives pre-filled from the live quote and the stop from the position's own stop level, so a full answer is usually one click away. Account size and risk % are remembered between sessions — locally, like everything else, and they are never included in the CSV export. If even one share would risk more than your budget, or the position would cost more than the whole account, the calculator says so plainly instead of printing a number you cannot use.
Price fields start at today's market price
If you have a Finnhub key saved, New Purchase Price and Sell Price open already filled with the current quote, marked by a small blue note under the field. That is a starting point, not a lock — type any other price to model a dip you would buy or a target you would sell into. Everything else in the scenario resets each time you open the calculator, so numbers never carry over from the stock you looked at before.
Trading Analytics
The Analytics tab answers the question every journal exists for: is my trading working? Statistics appear once the selected year has at least one fully closed position, and update automatically as you close more trades.
| Metric | What it tells you |
|---|---|
| Closed Trades | Fully closed positions this year — your sample size. |
| Win Rate | Share of closed trades with positive realized P/L, with the W/L split underneath. |
| Profit Factor | gross profit ÷ gross loss. Above 1.0 your system makes money; shown green or red accordingly. |
| Expectancy / Trade | Average result per closed trade. Positive expectancy means the strategy is worth repeating. |
| Avg Win / Avg Loss | The size of your typical winner vs typical loser — the heart of risk/reward. |
| Best / Worst Trade | Your extremes, each labeled with its ticker. |
| Avg Hold Time | Average days from first buy to final sell. |
Three charts complete the picture — Realized P/L by Month (green/red bars reveal seasonality and drawdown months), the Equity Curve (cumulative realized P/L trade by trade; hover any point for ticker, date, and running total), and Active Capital Allocation (a donut of capital still at risk per position — concentration risk at a glance; FREE positions don't appear, because nothing of yours is at risk there).
Backups, CSV export & import
JSON backup — the full snapshot
Export in the header downloads your entire journal — all years, positions, transactions, notes, and prompts — as one dated, human-readable JSON file. Import restores it on any device or browser. This is also how you move between Chrome and Firefox: export in one, import in the other.
CSV export — for Excel and tax season New in v1.0.7
The CSV button exports every transaction of the active year: date, stock, ticker, type, quantity, price, total, commission, transaction note, the position's realized P/L, and its status. The file opens cleanly in Excel, Google Sheets, or LibreOffice (UTF-8 with BOM — special characters survive).
The backup reminder New in v1.0.9
Privacy has a price, and this is it: there is no copy of your journal anywhere but this browser. Nobody can restore it for you. Clearing browsing data, resetting the browser, or reinstalling it erases every year, position and transaction permanently — and it takes one careless click in a settings dialog.
So indieTJ now keeps track. A small amber dot appears on the Export button once a backup is overdue, and hovering it tells you exactly when you last exported and how many changes you have made since. After 30 days — or 25 edits, whichever comes first — a banner appears above your positions with a one-click Back up now. Dismissing it delays the reminder by a week; it never turns it off, because the risk never turns off either.
Exporting resets the counter. So does importing, since the file you just loaded is a backup.
Working with years
Carry respects capital recovery: a position that reached FREE carries over at $0 cost basis, while one still at risk carries at its current average buy. Each year tells its own true story.
The AI Prompts library
The AI Prompts tab is a personal library for the prompts you reuse with ChatGPT, Claude, or any other assistant — pre-market checklists, risk reviews, psychology check-ins. It ships with a starter set; make it yours:
Where your data lives
Everything — positions, transactions, notes, prompts, settings — is stored in your browser's localStorage on your computer. There is no indieTJ server, no account, no sync, no analytics, no telemetry.
Exactly one network connection exists, and only if you enable it: price and ticker lookups to finnhub.io using your own API key. Requests contain ticker symbols only — never your quantities, prices, notes, or P/L. No key, no connections: the journal is fully offline.
Troubleshooting
| Symptom | Fix |
|---|---|
| Prices show “—” | No API key saved, or the key failed. Open 🔑 API Key → paste key → Save & Test. Also make sure the position name starts with a real ticker (e.g. MSFT — Microsoft). |
| No ticker suggestions | Autocomplete uses Finnhub and needs a saved API key. Without one, type the ticker manually — everything else works. |
| Analytics is empty | Statistics need at least one fully closed position (remaining quantity zero) in the selected year. |
| Unrealized P/L missing | It's computed from live prices, so it needs a working API key and at least one price refresh. |
| Data disappeared | Most often a different browser profile, or site data was cleared. Restore via Import from your latest JSON backup. |
| Same journal on two browsers | There's no cloud sync by design. Export JSON in one browser, Import in the other. |
Found a bug or have an idea? Support the project and leave a message at ko-fi.com/indietj.