Changelog
Every release, newest first. Updates are opt-in: download the new file when you want it; your data and key carry over.
Holdbound v1.0.5
Released 2026-08-26 · Download: https://holdbound.com/download · File: holdbound-v1.0.5.html (640 KB)
Your trades stay on your computer. Pay once.
A hardening release. Most of what is in it was found by turning the project's own checks on themselves: an automated sweep for things that fail without saying so, run after the checks that were supposed to catch them were themselves found wanting. Nothing about cost-basis arithmetic changed for existing data; one new warning may appear (see the reward note below), and it flags a number that was silently wrong before.
An account with a hand-paired transfer can be deleted again
Removing an account also removes your manual transfer decisions that pointed into it. A one-word slip meant that cleanup never matched anything, the stale decision then blocked the save, and the removal failed with a generic error — so any account you had ever paired a transfer on simply could not be deleted. Same class of slip as the pairing-warning bug fixed in 1.0.4, which is why this release also moved that logic into one shared, tested place instead of three hand-copied lists.
Two windows on the same file no longer fight in silence
Open the app file twice and both windows would happily save, each overwriting the other wholesale, telling nobody. Imported history could vanish that way. Now the window that saved second is told, plainly, and given the only two honest options: reload and take the other window's version, or knowingly save over it. Nothing is written until you choose.
If you own a licence, the app says so — all the time
Two wording fixes for paying customers. First: while a trial was still running, a licence whose update window had ended showed the trial countdown — a countdown to nothing, since nothing changes for you when it hits zero. It now shows Licensed, always. Second: a revoked key (a refund) was offered a renewal, describing an update window that had not ended. A refund means the purchase was undone; the honest offer is a fresh one, and that is what shows now.
Bad files get the right explanation
An empty file, a header-only export, and an XLSX/PDF/HTML file saved with a .csv name used to get one shared message about column names — misleading for all three. Each now gets its own: "This file has no rows", "Only a header was found — check the date range you exported", and "This does not look like a CSV file — export as CSV, not XLSX, PDF or HTML".
A reward with no value now says so
A reward or deposit that carries no value information was silently counted at zero cost — so a later sale showed the full proceeds as gain, with no hint anything was assumed. The number is still computed the same way (that part is your jurisdiction's question, not the app's), but the app now tells you it happened and which transaction to check. This is the one place this release may look different: if you see the new warning, the silent zero was already there.
For the record
The checkout server got a nightly, verified, restore-tested backup of the sales ledger; the privacy policy now discloses exactly what that means for deleted data (a deleted address can persist inside old backup copies for up to 30 days; a restore re-runs the deletions). The release pipeline now refuses to build from uncommitted sources and refuses to publish a build that was. None of that changes the app on your disk — it changes how carefully this thing is shipped.
Nothing else changed
Same data format, same storage, same offline licence check, same single file with no outside references. Your existing key keeps working; your data carries over untouched.
Holdbound v1.0.4
Released 2026-08-26 · Download: https://holdbound.com/download · File: holdbound-v1.0.4.html (640 KB)
Your trades stay on your computer. Pay once.
A small release with two fixes, both found the same afternoon by something that did not exist before: an automated run of the release acceptance checklist, driving the actual released file from disk in Chrome, Edge and Safari's engine.
Nothing about importing, transfer matching or cost basis changed. No calculation produces a different number than it did in 1.0.3.
A rule-breaking manual pair was accepted in silence
When the app pairs a withdrawal with a deposit for you, it shows its reasoning. When you pair two rows by hand and the pair breaks one of those rules — the amounts do not reconcile, the deposit lands before the withdrawal — the app is supposed to say so and keep your pair anyway:
This pair breaks: R3. It is kept anyway, marked as paired by you.
That sentence never appeared. A typo one line earlier threw an error immediately after your link was saved, so the link stuck and the warning was skipped. You got what you asked for and no indication that it disagreed.
That is the wrong failure. Pairing two things that do not belong together, quietly, is the specific behaviour this tool exists to avoid — a tracker that gives you a confident wrong answer is worse than one that admits it is unsure. The line is fixed and there is now a test over the decision so it cannot come back unnoticed.
If you have linked transfers by hand in an earlier version, nothing is wrong with your data: the pairs were saved exactly as you made them. Open Transfers and read the reason on each one if you want to check them.
If your update window has ended, you are offered a renewal — not the product
This one only affects people who have already paid, which makes it worse rather than smaller.
Buy Holdbound and every version released in your next 12 months is yours permanently. Download a version released after that window closed and it is not one of the ones you bought, so it runs on trial terms while your own versions keep working forever. That part was right.
What was wrong is what the licence page then said. It read the app's current access mode — "trial" for this particular build — and concluded you had never bought anything. So it showed you the first-purchase pitch: $29 once. Meanwhile the customer whose window still had a year left, who needs nothing at all, was shown the renewal card. The two were exactly backwards.
Now: if you hold a licence, you are offered a renewal, and the wording tells you the truth —
Your update window ended on 2025-01-01. The version you have stays yours and keeps working — renewing is only for getting the versions released since, and it adds twelve months from today.
That sentence had been written for this exact case and was unreachable in every build before this one.
Nobody was charged twice. Renewals are priced at $15 and always were; the page was showing the wrong card, not the wrong price to a checkout. If you bought at $29 in the last few days you are inside your window and none of this applied to you.
How these were found, and what it changes
The release checklist has always required opening the released file from disk, by hand, in four browsers. It also stated that no tool could do this, because browser automation cannot open files that way.
That turned out not to be true. Automating it took an afternoon, and the first run found both bugs above — one of which had been shipping since 1.0.0 with no test over it.
The manual run has not been retired, and should not be: automation cannot double-click a file, cannot use your browser profile with your privacy settings, and cannot be Safari on a Mac rather than Safari's engine on a PC. It runs first now, and the manual pass checks what it cannot reach.
Nothing else changed
Same data format, same storage, same offline licence check, same single file with no outside references. Your existing key keeps working; your data carries over untouched.
Holdbound v1.0.3
Released 2026-08-26 · Download: https://holdbound.com/download · File: holdbound-v1.0.3.html (640 KB)
Your trades stay on your computer. Pay once.
This release changes what you are buying, and then makes the app honest about it. The old pricing had two options — a one-time licence and a yearly one — and the yearly one could expire into read-only. That is exactly the thing this product exists to argue against, so it is gone. You now buy the software once, for $29, and it stays yours. The rest of this release is the app catching up: it tells you before something ends, it says plainly what ending means, and it stops pretending an ended update window is a punishment.
Nothing about importing, transfer matching or cost basis changed. No calculation produces a different number than it did in 1.0.2.
Pricing: what $29 buys, and what it does not take away
- $29, once. Every version released in the following 12 months — the update window — is licensed to you permanently. Not for a year. Permanently.
- After 12 months, updates are $15 a year, and optional. Renewing adds twelve months to whatever you have left rather than restarting it, so renewing early never costs you time you already paid for.
- Not renewing removes nothing. The versions you already have keep every feature, for as long as you want to use them. There is no downgrade, no feature that quietly stops, no nag beyond the update notice you can dismiss.
- Read-only now happens in exactly two cases: a 30-day trial that ended without a purchase, and a licence that was revoked (a refund, or a key published publicly). Even then the app opens, shows everything, and exports everything.
If you hold a key from 1.0.2 or earlier, it keeps working. A "membership" key's end date is read as an update window, which is the more generous reading; a "perpetual" key covers its major version with no window at all.
How "you are never downgraded" is actually implemented
Your key carries a date — the last day of your update window. Every build of the app carries the date it was made. The app compares those two dates to each other, never to today's date, which is why a key cannot expire: the day passing changes nothing, because both dates are fixed.
The practical consequence: a version built inside your window runs with every feature forever. A version built after your window still opens, still works, and says so plainly, offering the two honest options — renew, or keep using the versions you already have. It does not switch anything off. Switching things off is how you make renewal feel urgent, and that is not the product I want to ship.
A notice before access ends, instead of a silent countdown
- For a trial: a banner appears with 10 days left, changes wording with 3 left, and again once the app has gone read-only.
- For an update window: the same three stages, but wider — 30 days, then 7. Renewing means sending USDT by hand rather than a card being charged, and this is a tool you open weekly rather than daily, so a 7-day-only warning would be missed by a lot of people.
- Each stage is dismissed on its own. Waving away "10 days left" does not also hide "read-only since Tuesday".
- It is a banner, never a dialog. It blocks nothing.
- The count is real. The file knows when it was first opened and what date your key carries, so it counts down to the day that actually matters.
The primary button on every trial notice is "Export a backup", not "Buy". A trial ending is not supposed to hurt, so the notice is not a sales prompt: the useful thing at that moment is getting a JSON backup onto your disk, whether or not you ever pay me. Pricing is a secondary link for people who want it.
The update-window notice says outright that nothing renews by itself. There is no card on file anywhere in this product — easy to assume otherwise, unpleasant to discover on the day.
Fixes
- An owner in good standing had no way to pay again. With an active licence, the License page showed no purchase or renewal link of any kind; the only route to renewing was remembering the website address. There is now a renewal card showing when the window ends, stating that nothing renews automatically, and linking to the checkout. A window that has already ended sees renewal wording rather than the first-purchase pitch.
- Upgrading raised a false alarm about your own licence. A licence payload cached by an older build predates the
updateUntilfield, so comparing it byte-for-byte against a freshly parsed key made every existing licence look tampered with. The comparison now runs through the same normaliser both sides, so upgrading is silent — as it should be, since nothing was actually wrong. - A revoked key, a key for the wrong major version, and an ended update window are three different situations, and none of them is described as a finished trial any more. Each says what actually happened.
Data format
Unchanged: settings are still schema version 1. One field was added to record which notice you last dismissed; it defaults to empty, and backups from earlier versions restore normally.
Known issues
- The notice lives on the dashboard, so a file that has never had a CSV imported does not show one — there is nothing to back up yet. The day counter in the top bar is there from first launch either way.
Updates are opt-in. Your tool never changes under your feet. Open the new file and your data and key carry over; the old file keeps working. Every version released inside your update window is yours to keep, and the versions you already have keep working whether or not you renew.
Price data by CoinGecko. Not financial or tax advice.
Holdbound v1.0.2
Why 1.0.2 is the first file you can download. 1.0.0 and 1.0.1 were built and fully tested, but both embedded the checkout's test signing key — a licence bought from the real store would not have verified against them, so neither was ever published. 1.0.2 is the same software carrying the production key. Nothing about how it works changed.
Released 2026-08-26 · Download: https://holdbound.com/download · File: holdbound-v1.0.2.html (640 KB)
Your trades stay on your computer. Pay once.
This is the first public version. It is one HTML file: open it in Chrome, Edge, Firefox or Safari on Windows, macOS or Linux, and it runs there, with no install, no account and no server. Free for 30 days with every feature on; then US $19 once for every v1.x release, or US $29 a year for every release.
What it does
Import. CSV exports from Binance (transaction records and trade history), OKX (trading, funding, deposit and withdrawal exports), Coinbase (custom statement and Advanced/Pro fills) and Kraken (Ledgers and Trades), detected automatically, including the older layouts each exchange has used since 2017–2021. Anything else goes through a documented generic CSV template. Importing a statement and a trade history from the same exchange no longer books the overlapping fills twice; re-importing a file you already imported adds nothing. Every skipped row is listed with its reason.
Transfers between your accounts. Withdrawals and deposits are paired by transparent rules (same coin, different accounts, 48-hour window, received ≤ sent, shrink within the fee allowance; a shared transaction ID is conclusive). When more than one deposit fits, the app asks instead of guessing. Link, unlink and exclude by hand; your decisions always win and survive re-imports. Unpaired transfers are the single biggest source of wrong numbers, so the dashboard now says so in a banner and warns before you export a yearly summary with any still outstanding.
Cost basis. FIFO and average cost, per account or pooled across accounts, switchable at any time with instant recalculation. Fees are part of cost on buys and reduce proceeds on sells; fees paid in a third coin are small disposals of that coin. All arithmetic is exact decimal, never floating point.
An unknown cost basis stays unknown. If you sell coins whose purchase is not in your data — a partial history, a wallet you have not imported yet — the app no longer invents the sale date as the acquisition date. Those disposals are counted separately, marked unknown in the realized-gains export, and left out of the holding-period averages instead of dragging them to zero. Import the missing history and they resolve themselves.
Amounts in different currencies are never added together. A portfolio holding USD-quoted and EUR-quoted trades reports each separately rather than summing them into a number that means nothing.
Dashboard. Holdings, current value, cost basis of open lots, realized and unrealized P&L, realized P&L by calendar year. Prices from CoinGecko when you click Refresh, with manual price override for anything unlisted.
Holding-period insight. Your own closed trades grouped by holding time (under 7 days, 7–90 days, over 90 days), with count, win rate and realized P&L for each. Educational insights based on your own data. Not financial advice. The 7-day and 90-day views are performance windows, not tax categories.
Transactions. Every transaction with filters and search, plus your own notes, kept separately from the imported record.
Export. All transactions (CSV, re-importable), realized gains per method (CSV, with a Basis status column), yearly summary (CSV), full backup (JSON). Raw material for you or your accountant; no tax forms. Exports are also safe to open in a spreadsheet: a note or account label that begins with =, +, - or @ is written as inert text, so nothing a CSV carries can execute in Excel, LibreOffice, Sheets or Numbers.
Your data. Stored in the browser's IndexedDB for the file's location, with backup reminders (default weekly) and optional automatic backup download. Restore by merge or replace — and if a restore fails part-way, what you had before is still there. Every backup carries a format version; future versions upgrade old backups automatically.
License. Trial, one-time and membership keys verified offline with a public key embedded in the file. When a trial or membership ends the app becomes read-only: view and export everything, no new imports until a key is entered.
Updates. Opt-in. A quiet notice after a price refresh when a new version exists; you download the new file when you want it. Your tool never changes under your feet.
Speed
A 20,000-row import measured on a desktop machine: transfer matching 33 ms, and 523 ms for the whole portfolio calculation (parse, match, cost basis, unrealized P&L, insights). Everything runs on the browser's main thread, so that is also how long the tab is busy. Earlier builds took tens of seconds on the same data.
What it deliberately does not do
No exchange API keys or automatic sync. No DeFi, NFT or on-chain decoding. No margin, futures or lending (spot only; those rows are skipped and listed). No country-specific tax forms. No multi-user accounts. No analytics or telemetry of any kind.
Known limitations
- Coinbase's statement CSV does not document its time zone; check one row against the app and set the time zone on import if needed.
- Binance.US, Coinbase Pro "Account" reports and tax-center gain/loss reports are not transaction exports and are declined with an explanation.
- The UK same-day and 30-day matching rules and US specific identification are not modelled; the app offers FIFO and average cost and leaves the tax method to you.
- Coins whose basis is unknown and which are then transferred between your accounts become an ordinary lot dated at the transfer; the unknown stays recorded on the disposal itself.
- Some Safari configurations do not allow a file opened directly from disk to keep data between sessions. The app detects this, says so, and still exports backups — but on those machines, export before closing.
What comes next
New exchange formats are added in minor releases based on what people send in: if your export is not recognised, paste its header line into the Feedback form inside the app, or email support@holdbound.com. Minor releases ship roughly monthly and are free for every v1 license.
Price data by CoinGecko. Not financial or tax advice.