Ledger User Guide

Ledger is a trading journal for Hyperliquid, Lighter, Bybit and Binance. It reconstructs your trades from your fill history, runs the analytics a desk reviewer would, and gives you the journaling habits — plans, reviews, rules, lessons — that actually change behavior.

runs in your browser read-only · no keys perps + spot multi-wallet
← Back to Ledger Technical reference →
Privacy model. Everything is computed client-side from the exchanges' public APIs. Hyperliquid and Lighter need only your address. Bybit and Binance need a read-only API key: Ledger refuses one that can trade or withdraw, and the secret stays in your browser. Ledger can never trade. Your notes stay in your browser unless you deliberately link a file or deploy the optional sync server.

01

Getting started

  1. Open ledger.html in a modern browser (Chrome or Edge recommended), or open your deployed URL if you run the companion server.
  2. Paste a wallet address (0x…) and click Add. Add as many wallets as you like; each can carry a label. Every wallet's history is pooled into one combined view.
  3. Click Load all. Ledger pages through your fills, reconstructs round-trip trades, fetches funding and open positions, and renders everything.
  4. Explore the four tabs: Trades, Diagnostic, Review, and Project.

Just looking?

Click Load sample data (on the welcome screen, or Sample data in the setup panel). It generates a realistic five-month synthetic history and runs it through the normal import pipeline, so every panel is populated. Nothing is fetched and nothing is saved — reload or add a real address to clear it.

No wallet, or fills from another venue?

Paste data accepts raw fill JSON or a CSV (a header row with time, symbol, side, price, size — common column aliases are matched automatically, and you can also pick a file instead of pasting). The modal tells you live what format it detected. Imported fills feed the exact same engine.

02

Loading your data

Loads are incremental: fills are cached in your browser (IndexedDB) and only new activity is fetched. While the tab is open, auto-refresh pulls new fills roughly every 3 minutes (toggle with ⟳ auto).

Which exchanges. Paste a 0x address in Add and Ledger looks for it on both Hyperliquid and Lighter, adding each one where you have an account. For Bybit or Binance (USD-M futures), use Connect exchange with a read-only API key; it needs the companion server, which relays the signed requests. Binance's API only goes back 3 months, and Bybit's 2 years. Trades from other venues show a small venue tag.

  • Shift-click Load all forces a full re-fetch if something looks off.
  • A data-health strip under the header stays visible for as long as anything is incomplete — truncated fill history, partial funding fetches, failing browser storage — instead of a status message that scrolls away.
  • Hyperliquid's API caps how far back it pages. Your cached fills preserve history beyond that cap, which is why backups that include fill caches matter (see Exports & backups).

03

The Trades view

Every reconstructed round trip: direction, size, average entry/exit, PnL, fees, funding, duration, R multiple, and return. Toggle Perps / Spot at the top left; use the period buttons or a custom date range to narrow the window.

  • Click a trade row to expand it: the fill-by-fill history, a replay chart with your entries and exits marked on real candles (plus your planned stop and target as dotted lines, and ✕ marks at the worst and best prices while the trade was on), and the journal editor. Replay plays the chart forward a candle at a time; ⇤ ⇥ (or Shift+← →) jump fill to fill, showing the position size, average entry, unrealised and realised P&L after each fill, with your plan and note underneath. ← → step a bar, Space plays.
  • Open positions appear alongside closed trades and are marked as such; their PnL updates as prices move.
  • Partial or truncated histories are flagged per trade rather than silently blended in.

04

Journaling

Journaling operates at three levels. All of it lives in the same store, syncs the same way, and feeds the analytics.

Per trade

On any trade row: notes, tags, a named setup, a 1–5 rating, mistakes, your planned risk, a trade plan (entry / stop / target — scored later for adherence), and image attachments (paste screenshots straight in). The more trades you journal, the sharper the pattern miner and setup scorecards get.

Write the plan while the trade is live. Open positions have a journal row too. A plan saved while the position is open is badged written live; one last changed after the close is badged written after close and scored separately, because hindsight plans flatter your stop discipline. Recent perp positions with no written stop get a dashboard nudge.

Plan vs outcome. Once a planned trade closes, its row shows the planned R:R, the R you achieved (1R = your entry to your stop, before fees) and a verdict: followed the plan, exited early (before the target), stop moved or widened (a loss bigger than the stop) or held past the stop (price went through it while you stayed in). Diagnostic → Plan vs outcome adds them up: how often you plan and follow, and what each kind of deviation cost against the plan, by setup too.

Journal inbox (Review tab). Every closed trade from the last 30 days with nothing journaled waits here, one at a time: type the setup, press 1–5 to rate (outside the text box), tick any mistakes, press Enter to save and move to the next one. A streak counts consecutive trading days where every trade is journaled. Today never breaks it while you're still trading.

Per day — the Day journal (Review tab)

Write the plan before the session: bias, what you'll trade, and a committed max loss. That number becomes today's tripwire threshold — a limit you chose calmly, enforced when you aren't. End the day with a short review and an "I followed the plan" check. Clicking a day on the calendar heatmap opens that date's entry.

Prep rates sleep, stress and focus from 1 to 5. Once about ten trades carry a prep score, the pattern miner tests them like any other condition ("low focus", "slept badly"), so how you felt becomes a measured edge or leak instead of a guess.

Per week — the Weekly review wizard (Review tab)

Three questions about the last completed week, with your best and worst trades prefilled: what worked, what changes, and a one-line lesson. Lessons collect into a browsable lessons library with the latest surfaced on top — the cheapest edge available is rereading your own lessons before the session.

04b

The coach

The card at the top of the dashboard turns everything Ledger measures into four plain lines: Last session (your last trading day, process before profit), Today (the one next action — write your plan, answer the question about a trade that just closed, or the top leak from your numbers), This week (your focus habit, a dot per trading day) and Remember (one of your own lessons). Below it, wins: good-process streaks, stops honored, good losses, rules you now break less.

Habits and the weekly focus (Review tab)

A habit is a when-then plan: "When I close a losing trade, I wait an hour before the next entry." Pick one from the library or from any finding (Adopt as habit), or write your own. Library habits are scored automatically from your trades and journal; your own habits follow the day journal's "I followed the plan" check. One habit is this week's focus — the coach tracks it, and next week's review asks whether to keep it.

One question after each trade

Closed trades show a question chosen for what happened — you held through your stop, gave back a big gain, added to a loser, or had a clean win. Answer it in the notes, or in one line in the journal inbox.

Progress: levels, streaks, challenges, achievements

Review → Progress turns good process into a game — never profit, never trade count. Each trading day earns its Discipline score as XP — read from your fills, so it needs no logging (one clean trade earns as much as ten) — plus bonus XP for what you log (prep, a plan before your first trade, journaling, stops, a respected loss limit), plus bonuses for focus-habit days, completed weekly challenges (one target a week, picked from your biggest leak) and achievements such as "walked away at the limit" or "ten good losses". Your discipline streak counts trading days at Discipline 70+; days you don't trade never break it, and a perfect week earns a shield that absorbs one bad day. You also get personal bests, an estimate of what discipline has saved you, a monthly report card and a weekly share card — images with grades but no dollar amounts, which you can download, copy, or send to an accountability partner if your server has one set up.

Turning coach mode off

Prefer a plain journal? Switch Coach mode off in the settings panel (⚙), or click hide coach on the coach card. That hides everything from the coach, habits and progress work: the coach card, habits, progress and achievements, wins, the process score, the journal inbox, prep, rules from findings, live-plan badges, the question after each trade, the AI letter and the end-of-day nudge. Nothing is deleted: switch it back on and everything returns as it was. The setting follows you across devices.

Daruma: the simple view

Open /daruma on your server (or Daruma view in the footer) for a phone-first version that works with zero effort: three dials read from your fills — Form (your recent trading against your usual), Discipline (trades free of revenge entries, sizing up after losses, adding to losers, trading on after two losses, overtrading and over-held losers) and Load (today against your usual day) — plus a Stats tab. Plan your next trade on Today saves a stop, target and one-line reason before you trade; it attaches itself to your next trade on that market and side within 24 hours (or expires), and Stats → Your plans tells you how often you follow your plans and what not following them cost. Logging prep, a plan or journal only adds bonus XP and sharper insights. It installs as its own app from the browser's share or install menu. Anyone you send the link to adds their own wallet address, and their journal stays in their browser; set an access token on your server before sharing, or everyone shares one journal.

Social: leagues, competitions and following

Daruma's Social tab lets the people you share your /daruma link with join your league. Each week the traders with the most XP move up a league (Bronze to Diamond) and the bottom ones move down. Leaderboards rank weekly XP, discipline and streaks; return boards show only traders who opt in, and returns are read from the chain, not typed in. Competitions are created by the owner — Discipline, Survivor (never hit your loss limit), Journal streak, and Return under a drawdown cap. Follow traders, give kudos, and adopt a habit someone else runs with one tap. What you share decides what others see; your journal, notes and trades stay in your browser unless you post a trade or send one to your mentor.

Mentors and trade reviews

The league owner can make members mentors. Mentors earn XP for teaching: a trade they review with a comment (15), a note on your day (5, a few a day), and 25 when someone they’ve worked with in the last 30 days plugs a leak, has a perfect week or reaches a Trader Age milestone, all read from that member’s verified trades. It raises the mentor’s level; league tables and duels never count it. Switch on Let mentors see my days (Profile & privacy) and they see your daily scores, slips and lessons and can leave you notes. You can also send them one trade to look at: Ask mentor on a trade in Daruma’s journal, or Ask my mentor to review this trade under an open trade in the full journal. They get its market, side, times, prices, % and R and a size range, with your note and the day’s plan; the dollar result only if you share dollar P&L. Mentors find it under Trades to review (Social → Reviews), comment as often as they like and mark it Reviewed ✓. Each comment lands in your inbox; you reply in the thread, in Daruma or under the trade in the journal, where it shows Reviewed by @mentor. Only you and the league’s mentors see a thread (admins can read it for moderation), and switching mentors off closes all your threads to them at once. You can take a trade back, which deletes its thread. Ten trades a day; comments up to 1,000 characters.

Duels

Challenge anyone in your league 1 on 1 for a week or a month, from their profile or under Social → Duels (where your partners, people you follow and league-mates are one tap away): on Discipline, clean days, last one standing, journaling or process XP (and % return with a drawdown cap, if your league allows it). They have 48 hours to accept, decline or suggest other terms; the duel starts the next Monday (or the 1st) and Daruma keeps score from your fills and your app. The winner gets a mark on their record and, for a duel played to the end, the league’s XP bonus. You can also stake XP (never money): you each put up the same amount and the winner takes the other’s, up to a quarter of your XP across your open duels. Back out before the start and nothing counts; forfeit after it and the other side wins. To stop receiving challenges, switch off Accept duel challenges under Profile & privacy.

Ladder. Every 1-on-1 result moves your duel rating (everyone starts at 1000; beating a higher rating counts more; a duel backed out of before the start doesn’t count). After 3 duels you show on the ladder under Duels, if your profile is public and you take challenges. Each quarter is a season: the 3 members who gained the most rating get a badge, then every rating moves a quarter of the way back to 1000.

Group duels. Under Duels, tap Group duel to invite 2 to 5 people to the same contest. Each has 48 hours to answer; it starts the next Monday (or the 1st) once 3 of you are in. Everyone’s score is on one card, the winner gets the league’s XP bonus, and everyone gets a place. There are no stakes, and it doesn’t change your rating. Leave after the start and you place last.

Traders like you

Under Stats, Daruma compares your last 90 days with anonymous traders of your style, trade size and experience: how many of 100 you do better than on Discipline, revenge trades, journaling, win rate and profit factor, and the one habit that most separates the best of them from you. The full journal's Review has the detailed table. It needs 15 closed trades over at least two weeks (your league may set a different bar). Your app sends an anonymous summary (no trades, coins, amounts or wallet) unless you switch off Count me in “Traders like you” under Profile & privacy; groups of fewer than 25 traders are never shown. Other members only ever see the groups. The league’s owner and admins can see your own summary and stats, to help run the league.

What traders like you changed when they improved. The server keeps each anonymous summary once a week for about six months. It finds traders in your group who went from the bottom half to the top half on Discipline or profit factor over 8 to 12 weeks, and shows what changed most for them compared with everyone else, like “They cut trades per week by about 40%”. Tap a change for the numbers, or tap Make it my habit to add the matching habit. Only group medians are shown, and only when at least 5 traders improved and 5 didn’t. Switching off Count me in deletes your history too.

Claiming your wallet and using Daruma on other devices

Under Social → What you share → Account, Claim with my wallet asks your browser wallet (MetaMask, Rabby, or your wallet app's built-in browser) to sign a short message. It's a signature, not a transaction: no gas, and nothing moves. A claimed wallet is locked to your profile — nobody else can use it, others see a ✓ — and you can sign in with it on any device. A phone without a wallet app can sign in with a one-time code from Add a device instead.

Your journal on every device encrypts your journal, wallets and settings on your device with a sync passphrase before sending them, so the server — and its owner — only ever store scrambled data. There's no reset: if you lose the passphrase, the synced copy can't be opened (your devices keep their own copies).

More leagues and global leaderboards

The owner can run extra leagues, each ranked its own way — XP, verified discipline, streak, % return, $ P&L or return per drawdown, weekly or monthly. Find listed ones under Social → Find leagues by name or number; each has a page with its rules and top five before you join, and you can be in several. Global leaderboards rank everyone who opted in, regardless of league.

Unlocks

Some Daruma features unlock as you level up — by default deeper Stats insights at level 2, share cards at 3, competitions at 4. XP comes only from process, so the way to unlock is to prep, plan, keep your stops and journal. The owner decides the levels, and can fully unlock members. The full journal is never locked.

Without a profile, levels stop at level 3 (the owner can change it). Your XP keeps counting, and creating a profile unlocks everything you’ve earned at once. A profile takes only a name, and you choose what’s shared. You can leave every ranking off. Daruma counts people using it without a profile anonymously: once a day per device, with no wallet or address kept.

Routines, reviews and report cards

Daruma works out whether you trade like a scalper, day, swing or position trader (you can change it in Prep) and asks questions that fit: a short morning prep (once you've answered a question on five days, the answers you keep giving — and, for the setup question, your setups — appear under it as one-tap usuals) and an end-of-day review — a rating, a few questions, the lesson and tomorrow's one thing. Report cards grade each week and month: habits kept, slips and what they cost, best and worst trade, and how it compares with the period before.

Leaks, habits and badges

Progress shows your leaks — slips that keep costing you, and whether they're shrinking. Plug this leak turns one into a habit that's checked from your fills: three clean trading weeks in a row plug it and earn a badge. Only weeks you traded in count: a week traded without that slip adds one, a week with the slip starts the count again, and a week with no trading is skipped. Each habit has its own streak with shields, and Today nudges you when a trigger you tend to slip after is happening right now. There are about 280 badges in six tiers, revealed as you go; switch on your public badge page to share it.

Trader Age

Trader Age is how seasoned your trading process looks, in years, next to how long you’ve actually traded. Every trading day is rated from 0 to 100, mostly on your Discipline score, plus how steady your days are, whether you kept your loss limit, and your prep and journaling. Your last 6 months count, recent days more. Every 10 points doubles it: a rating of 50 is 1 year, 60 is 2, 70 is 4, 80 is 8. Only days you trade count, so a break freezes it, and profit never moves it. Pace compares this week with your 6-month norm: above 1× you’re maturing, below 1× this week is pulling you back. It appears after 15 trading days, on Today, on Progress and on its own screen. With fewer than 60 trading days it’s held closer to 1 year (so a lucky few weeks can’t read as 20 years), and the screen shows the range it’s likely in. The screen also shows it over time next to how long you’ve traded, and what your slips cost: your Trader Age without each kind of slip. Crossing 1, 2, 4, 6, 8 and 12 years earns the Seasoned badges. With a profile, a wallet the server can read and Verify my discipline on, the server works it out from your wallet’s trades and marks it ✓ verified; only a verified Trader Age goes on your weekly share card.

XP multiplier. Hold a verified Trader Age of 4 years or more and your daily XP grows: ×1.05 after 2 good trading weeks, up to ×1.5 after 26. A good week means that week and your 6-month Trader Age are both there; a week below drops you one tier, never back to the start, and weeks you don’t trade don’t count either way. It applies from the week you earn it, so XP you already have never changes. League tables and duels use your XP before the multiplier.

Standing. Duels, competitions, the leaderboards and the coach’s full allowance stay open while your last 20 trading days hold a Trader Age of 2 years or more, with your wallet verified. If they slip under it, or your wallet isn’t verified, Daruma tells you and you have 14 days to get back. The clock waits while you’re not trading. If it lapses, those lock (the coach drops to 1 message a day) until you’re back at the bar. Your league table, level, XP and badges never change. Fewer than 15 trading days counts as good.

Tilt alerts

While you trade, Daruma checks each refresh's new fills for a few patterns that tend to come before a bad day: a new trade within 15 minutes of a loss, 3 losses within 45 minutes, a trade over 1.5× your usual size right after a loss, more trades than your prep's max (or well past your usual day), and your loss limit 80% used or reached. When one shows up, Today shows a short banner that names it, for example “3 losses in 40 minutes. This is when revenge trades happen. Step away for 15 minutes?” Taking a break starts a 15-minute countdown and notes the break on the day (it never changes your Discipline score); Dismiss puts it away. Each pattern comes at most once a day, and never within 30 minutes of the last alert. If you allow notifications, the alert also comes as a notification while Daruma is open or in a background tab. Turn alerts off in Settings → Tilt alerts. If you share verified Discipline and have reminders on, the server can send the same alerts as a push while Daruma is closed (Tilt alerts while Daruma is closed, under Reminders).

Share my week

On Progress, Share my week makes an image of your week: your Discipline average, clean days out of trading days, your streak, level and XP gained, your duel record and your top badges. There are no dollar amounts and no P&L on it, on purpose. Pick 4:5 or square, dark or light, and whether level, duels and badges show; then share it, download it, or copy it. The image is made in your browser and isn't uploaded anywhere.

AI coach (optional)

When the server runs with COACH_AI=1, the Coach tab lets you ask the AI coach (Claude or OpenAI's GPT, whichever the server uses) about your trading, 3 messages a day (shared by profiles on the same wallet; admins have no limit, and an admin can reset your count). It sees a summary of your numbers, habits and leaks; your trades and notes only if you switch that on. Wallet addresses are removed, and the server keeps only a count of messages.

Admin panel

The server owner signs in at /admin with the access token to manage members (add, edit, boost XP, unlock, sign-in codes), leagues, reward badges, levels and XP, feature levels, the coach's allowances, routines, competitions and announcements. To share the work, Members → Add admin gives a sign-in link for a co-admin: they use the panel with their own profile, never the access token, and can do everything except add or remove admins.

Two-factor for the panel. Under Settings → Security, the owner and each admin can add an admin passkey or an authenticator app (scan the QR code). After that the panel asks for a second step when a browser signs in — a passkey, a 6-digit code or one of ten one-time recovery codes — and remembers it for 12 hours. It only guards the admin panel: the access token works alone everywhere else. The owner can require it of every admin, and reset an admin who lost their phone; a server owner who lost every factor runs node server.js --reset-admin-2fa (or sets ADMIN_2FA_RESET=1 and restarts).

Coach's letter (optional)

If your server runs with COACH_AI=1 and an Anthropic or OpenAI API key, the weekly review offers Write my letter: a short note from the AI coach on last week — what went well and the one thing to work on. Open Exactly what gets sent first: it's an aggregate summary (counts, averages, habits, finding headlines, your lessons). No fills, wallet addresses, trade notes or screenshots are sent.

05

The Diagnostic view

The full statistical work-up of the current view and period:

  • Headline stats — net, win rate, expectancy, profit factor, payoff, drawdown, Sharpe/Sortino, streaks, hold times, fees and funding, green days.
  • Edge significance — is your expectancy statistically distinguishable from zero, with honest confidence bands and a Monte-Carlo drawdown expectation for your own return stream.
  • Breakdowns — by coin, direction, weekday × hour heatmap, tag, setup, wallet — each with its contribution to the bottom line.
  • What your numbers say — every recommendation as a plain-language card: what's happening, one thing to do, and how sure the numbers are ("Very likely real", "Probably real", "Early signal"). The statistics are one click away under The numbers.
  • Pattern miner — searches your journaled conditions (tags, setups, hours, sizes, and pairs of them) for the highest- and lowest-expectancy pockets, with multiple-testing correction so it doesn't sell you noise.
  • Discipline & rules — define personal rules (max trades/day, cooldown after a loss, daily loss limit, no adds to losers) and see how often you broke each one and what it cost.
  • Rules from findings — any leak in the pattern miner has a + rule button, and a What if I stopped doing X replay that would have made money offers Make this a rule. Each rule is scored like the built-in ones (breaks and their dollar cost) and answers did the rule work?: the share of trades breaking it before you made it vs since, with a significance test. Rules known at entry (market, direction, size, streak state, setup, tag, prep) also put a warning chip on the dashboard when an open position breaks them.
  • Plan adherence — for trades with a written plan: stop-honored rate, target-hit rate, planned vs realized R, and the total cost of blown stops. Once price excursions are measured it also catches trades where price went through your stop and you held on, even if the exit recovered. Plans written live and after the close are reported separately.
  • Funding carry, leverage survivability, correlation clusters, scenario shock — the quiet costs and the concentration risks of the open book.
  • Export report / Export PDF — a self-contained snapshot of the whole view for sharing or archiving.

06

Price excursions (MAE/MFE)

Run Price excursions to measure, from real candles, how far each trade ran against you (MAE) and in your favor (MFE) between entry and exit. This answers two expensive questions:

  • Where should stops live? If winners rarely drew down more than 1R, a tighter stop was free.
  • How much did you leave on the table? MFE against realized exit shows whether your targets are too shy or too greedy.

Candles are cached and fetched incrementally, so re-runs only fill gaps. Measurements for closed trades are saved permanently; the candle cache itself can be cleared any time without losing them.

07

The Review view

The habit loop. Besides the day journal and weekly wizard above, it holds:

  • This week / last 30 days — net, trades, win rate, expectancy, each against the prior window.
  • Monthly goals — set a monthly target, a max-drawdown cap, and a trades/week cap; the month is tracked against them with pace and projection.
  • Costs & variance — your current Hyperliquid fee tier from your exact trailing-14-day volume (perps plus twice spot, as Hyperliquid counts it; spot priced at spot rates), the distance to the next tier, and what last month's taker flow would have cost one tier up or executed as maker (verify rates against app.hyperliquid.xyz/fees); and variance expectations — simulated from your own win rate and distribution: the odds of a 4-, 5-, 6-loss streak in your next 200 trades, and your 1-in-20 bad month at current sizing. Decide now what normal-bad looks like, so a live drawdown reads as variance instead of falsification.
  • Process — a 0–100 process score for each trading day, graded on how you traded rather than what the market paid: plan filed before the first entry (20), trades breaking no rule (20), trades with a live plan (15), planned stops honored (15), no new entries after the day's loss limit broke (10), trades journaled (20). Parts that don't apply that day drop out of the weighting, and the two planning habits are only graded from the first day you used them. Next to it, process vs outcome splits your last 60 trading days into good process on green and red days, and poor process on green and red days. Many "poor process, green" days means the market is carrying you. The dashboard's Daily PnL calendar can switch to this score with its PnL / Process button.
  • Habits vs results — one dot per trading day: across, your habit score (the share of your habits you kept that day: plan, rules, stops written, prep, review, journaling, and no revenge entries, sizing up after a loss, adding to losers or overtrading); up and down, the day's result in $, % or R. A trend line, the average day per habit-score band, and which habits pay (kept days minus missed days). It shows from your third trading day; from 8 days it says in plain words whether keeping your habits goes with better results. Daruma has a simple version under Stats → Do your habits pay?: a plain answer, a “how sure” meter, your habit days next to your other days, and the habit to protect.
  • Focus for next week — a short list of concrete things your own numbers say to do differently.

Every chart explains itself: hover it (or tap on a phone) for the numbers behind the point and a line on what the chart shows.

08

The Project view

Forward visualization — explicitly a what-if, not a forecast. Pick a lookback and a horizon; Ledger resamples your own daily results forward a few hundred times and shows where the paths land: the median, the good and rough stretches, the odds of finishing green, and a drawdown reality-check (the dip half of the futures contain, and the 1-in-20 one you should be sized to sit through).

It also carries the pre-trade sizer: account size, entry, stop → position size for your chosen risk, alongside Kelly-derived guidance from your actual edge.

09

Rules, tripwire & guardrails

Live banners watch the dashboard while you trade:

  • tripwire When today's realized PnL (plus any open-position decline since your first look today) crosses your daily loss limit — the committed max loss from today's day journal, or your standing rule — a banner tells you to step away. It warns early at 60% of the limit.
  • unplanned trading Two or more trades today with no day-journal plan filed gets a nudge: the review will ask why.
  • risk creep If the median size of your last 20 trades has grown much faster than your capital, you'll hear about it — sizing that follows a win streak instead of the account is the classic failure.
  • tilt cooldown After a loss, if your own history shows trades within the hour of a loss underperform, a cooldown suggestion appears.
  • rule broken An open position that breaks one of your rules from findings.
  • no stop written A perp position opened in the last 7 days with no written plan. Write it now, while it counts.

Desktop notifications: when you save a loss limit (in rules or the day journal), Ledger offers browser notifications — then the tripwire fires an OS notification even when the tab is in the background. One notification per condition per day.

10

Filters, periods & settings

  • Perps / Spot toggle, period buttons (7/30/90 days…), and a custom date range apply everywhere.
  • Timezone toggle (UTC / local) changes what "a day" means for the calendar, day×hour heatmap, day journal, and daily PnL.
  • Break-even band (default $50): trades inside ±band count as scratches — neither wins nor losses — so tiny outcomes don't pollute your win rate. Set it to match your sizing.
  • R basis: R multiples scale to your average loss by default, or to a fixed $ risk; either can be overridden per trade with journaled risk.
  • Install app: when served over https, Ledger installs as a PWA.

11

Exports & backups

ButtonWhat you get
Export CSVThe trade table as CSV.
Export taxAccountant-ready CSV of every realized trade, tax-year column, per-year summary.
Tax PDFBank-statement-style PDF: yearly and monthly summaries plus every realized trade with a running balance. Generated entirely in your browser.
Spot lots8949-style FIFO cost-basis lots for spot sales, short/long term flagged, unknown-basis lots marked for your accountant.
Tax export by country…Tax files set up for your country (US, UK, Germany, Australia, Canada or FIFO by calendar year), in your currency, with a preview per tax year. Also Koinly CSV and CoinTracker CSV for those tools to import: for all your history, one tax year, or dates you pick. Spot fills are trades; each closed perp’s realised P&L is a margin gain or loss (“realized gain” in Koinly) with its fees, and its funding a row of its own (paid: a margin fee); deposits and withdrawals are transfers. In Koinly or CoinTracker, add a wallet for the exchange and import the file. Import your whole history once so spot buys carry their cost.
Export journalYour journal entries as JSON.
Backup allThe important one. Everything portable in one JSON — journal, wallets, settings, MAE/MFE measurements, and the fill caches that preserve history beyond the API's pagination cap. Re-import it to restore, including on another device.
Backup to server(when server sync is connected) The same full backup stored on your server — newest 10 kept.
Clear candle cacheFrees the largest thing in browser storage; saved measurements are kept and candles re-fetch on the next run.
Make a habit of Backup all. Your fill caches are the only copy of history older than the exchange API serves. One JSON in a safe place covers you.

12

Saving your journal: three modes

  • Browser storage (default) — works out of the box; tied to this browser on this device.
  • Linked data file — bind the journal to a real JSON file on disk that auto-saves on every change. Put it in a cloud-synced folder to use across devices. Chrome/Edge only.
  • Server sync — deploy the companion server (next section) and every edit auto-saves within about a second, follows you across devices, and survives reinstalls. The status bar shows ☁ Server sync · rev N · saved. Edits from two devices are merged, not lost: the newer state wins and your unsynced edits are re-applied on top.

With server sync, the server also keeps rotating daily snapshots (last 14 days) — the History button restores any of them if an edit went wrong.

13

The companion server

Optional, zero-dependency, and small: one server.js that serves the app, persists your journal, and adds automation. The quick version (Railway, but any Node 18+ host works):

  1. Deploy the repo (start command node server.js).
  2. Attach a persistent volume at /data — without one, your journal is wiped on every redeploy.
  3. Set AUTH_TOKEN to a long random string. Your journal holds wallet addresses and trading notes; without a token anyone with the URL can read them.
  4. Open the URL, enter the token once per browser. Done — sync is automatic from then on.

It also exposes a read-only analytics API (GET /api/v1 is self-describing) for scripts and dashboards, including GET /api/v1/metrics with a Prometheus mode for Grafana or Home Assistant. An optional READ_TOKEN grants analytics access and nothing else.

14

Alerts & automation

All opt-in via environment variables on the server:

VariableWhat it does
REFRESH_INTERVAL_MINRefresh server caches from Hyperliquid on a timer, so monitoring works with the app closed.
ALERT_WEBHOOKDiscord / Slack / ntfy / any JSON endpoint. Fires when something needs a human during the session.
ALERT_LIQ_PCTAlert when a position is within this % of liquidation (default 10).
ALERT_DAILY_LOSS$ daily-loss alert; falls back to your saved in-app rule.
ALERT_FUNDING_24HAlert when funding paid per 24h exceeds this $.
COACH_AI + ANTHROPIC_API_KEY (or OPENAI_API_KEY)Turns on the coach's weekly letter in Review (see The coach; only an aggregate summary is sent) and the AI coach chat in Daruma. COACH_AI_MODEL picks the model (default claude-opus-5-5).
NUDGE_HOUR + NUDGE_TZEnd-of-day journaling nudge: once a day after this hour (0–23), if trades closed today are unjournaled or the day has no end-of-day review, a reminder goes out on the alert channels. The hour and "today" follow the app's own clock setting (UTC, or your browser's zone), so it always looks for the review under the date you wrote it; NUDGE_TZ is only a fallback. Runs on the refresh schedule, so it needs REFRESH_INTERVAL_MIN.

Alerts also fire on a drawdown deeper than the 95th percentile expectation for your own return stream — statistically unusual, not routine variance. Everything dedupes with a cooldown, and once a week a weekly digest (trades, net, win rate, expectancy, fees, best/worst, prior-week comparison) is written and delivered.

15

The Telegram bot

Set TELEGRAM_BOT_TOKEN (create a bot with @BotFather) and TELEGRAM_CHAT_ID (your chat id, comma-separate several — @userinfobot tells you yours). Alerts and digests then arrive on your phone, and the bot answers commands — read-only, always:

CommandAnswer
/todayRealized PnL and trade count today, against your daily loss limit.
/riskOpen book: positions, gross and net exposure, account value, anything near liquidation.
/statsLast 30 days: trades, net, win rate, expectancy, profit factor, fees.
/goalsThis month against your goals: net vs target, projection, drawdown and trades/week caps.
/digestThe latest weekly digest.

Messages from anyone outside your allowlist are ignored silently — no reply, no error, no confirmation the bot exists.

16

Troubleshooting

Numbers look off / trades missing

Shift-click Load all for a full re-fetch. Check the data-health strip: a "truncated" flag means the exchange API stopped serving older pages — history past that point exists only in your cached fills and backups.

My win rate seems wrong

Trades within the break-even band (default ±$50) count as scratches and don't enter the win rate. Adjust the band in settings to match your sizing.

Spot symbols show as @123

Spot pairs resolve to token names from exchange metadata; reload once with a network connection and they map through.

The browser is using a lot of storage

Cached candles from excursion runs are the bulk of it. Clear candle cache is safe — saved MAE/MFE measurements are kept.

Two devices show different journals

Without server sync or a shared linked file, each browser keeps its own store. Use Backup all → import to move data, or deploy the sync server for automatic merging.

The token prompt never appears on my deployment

You're likely serving an old ledger.html next to a newer server — the server logs a warning about it at boot. Redeploy with both files current.

Alerts fired twice / not at all

Alerts dedupe per position and per day with a 6-hour cooldown, and the dedupe state survives redeploys. If nothing fires at all, confirm REFRESH_INTERVAL_MIN is set — alerts are evaluated on the refresh schedule.