Repository navigation
What's Changed
BitcoinTX 1.2.9 is the stable version of BitcoinTX 1.x (below, "About this release"). It fixes the bugs found in 1.2.8's testing and the reviews since, several of which could make a tax figure wrong; lets an install that uses Tor download the price history once without it, if you agree; asks before Delete All wipes the ledger; and runs BitcoinTX as its own user instead of root. Updating from 1.2.7, you also get 1.2.8's changes, marked (1.2.8): prices at the hour, one price choice, inherited bitcoin and consolidation fees.
What to do after updating
- Reload BitcoinTX's page in your browser. A page still open from the version before can show a date originally acquired or a date of death a day early, and save that day with an edit.
- Ledger Review, then Recalculate Ledger. A task asks once. First open Settings > Ledger Review in BitcoinTX: "Figures that Recalculate Ledger would change" lists each transaction whose figures move, old and new; most move by a cent or two. Then run the StartOS action Recalculate Ledger, or Settings > Recalculate Ledger in BitcoinTX.
- Check your tax timezone in Settings > Tax Timezone (below, "Your tax timezone").
- Update your AI connector. In your AI app's configuration, change the version after btctx-mcp== to 1.2.9 and restart the AI app.
- Updating from 1.2.7 or earlier? Also log in again (everyone does once), and confirm where prices come from: unless the action Price Source & Privacy sets it, BitcoinTX's Dashboard asks once, and asks nobody until you do; if you never made a choice in that action, a task asks once.
Fixes that change tax figures
Each says who could be affected and what to do. Unless it says otherwise, any tax year with such a transaction can be affected. Most ledgers need only the steps above.
- Cost basis to the cent. A lot sold, spent or moved in pieces could claim a few cents more or less than it cost, and a disposal's last row could come out below $0. Versions 0.8.0 to 1.2.8, any tax year; cents only. What to do: Recalculate Ledger, as above.
- A spend's network fee counted twice in its gain (1.2.8). With a BTC network fee, a Spent withdrawal's gain was too high by the fee's value, usually a few dollars. Versions 0.9.2 to 1.2.7, every tax year; only ever more tax, never less. What to do: Recalculate Ledger, as above. Whether to amend a filed return over a few dollars is for you or your tax professional to decide.
- Old ledgers, started before 0.9.2. A bitcoin withdrawal of a purpose BitcoinTX doesn't list (such as "Expenses"), or of none, now counts as Spent, at what was saved as received; it counted as a sale, at $0 when that amount was kept only in an older field, or with its network fee not taken off. A purpose or source saved with spaces (" gift ", " Income ") now counts as the one it names: such a gift counted as a sale, such income was left out. Versions 0.9.2 to 1.2.8 (a purpose or source with spaces: every version to 1.2.8). What to do: Ledger Review lists those withdrawals: confirm Spent or choose Gift, Donation or Lost, then Recalculate Ledger. One listed as "none recorded" may have lost its amount at a recalculation under 1.2.8: the copy of the database BitcoinTX made before updating to 1.2.8 still holds it (the changelog says where).
- A date originally acquired or a date of death stays the date you entered. After a change of the tax timezone by about 12 hours or more, it could move a day, changing a holding period or an inheritance's value. Versions 1.2.6 to 1.2.8. The update keeps each date as the form showed it. What to do: if you changed the tax timezone by many hours after entering such a date, check those dates against your records.
- Your tax timezone. While none had been chosen, a login saved the browser's timezone as the tax timezone and recalculated the ledger, without a word: a sale near midnight or near its one-year anniversary could move to another tax year or term. Versions 0.8.0 to 1.2.8. Now a login sets it only on an empty ledger. What to do: check Settings > Tax Timezone. If it's where you file, today's figures are right, and if a return you filed differs from them, ask your tax preparer whether to amend it. If it isn't, choose the right one there.
- Imports: a decimal comma or a stray comma. The CSV and River imports read "0,5" BTC as 5 BTC and "21.000,00" dollars as $21; a CSV row with a comma outside quotes (an amount like 20,000.00) moved every later column, so a $20,000 basis was saved as $20. Every version with the imports; both are now refused. What to do: if a file you imported had such a number, compare its transactions with the file and edit any that differ.
- River: auto-withdrawals and mining payouts. An auto-withdrawal to your wallet was suggested as a spend (a sale on Form 8949), and a mining payout was skipped (its income left out). Versions 0.7.0 to 1.2.8. What to do: if you kept them as suggested, delete those spends and import the River file again: it suggests Transfers to Wallet, and the payouts as income.
- A transaction of the same amount skipped as already recorded. The River import and the AI connector left out a transaction when another of the same amount was recorded within 48 hours (two Interest payouts a day apart), or, for the AI connector, into or out of the other bitcoin or dollar account: its income or cost basis was missing. Versions 0.7.0 to 1.2.8. Now only a true duplicate (the same kind, amount and minute) is left out, unless you say otherwise. What to do: check that transactions of the same amount within two days of each other are all in your ledger; previewing a River file again shows any it skipped.
- The same rows saved twice. An AI connector add sent again after a timeout, or a file imported in two tabs at once, could save its rows twice. Every version. What to do: look in Transactions for a transaction recorded twice, side by side, and delete the extra copy.
- A gift made a Spent later. A gift, donation or lost coins saved in the form, then made a Spent through the AI connector or the API, was a $0 sale, its whole cost basis a loss. Versions 0.8.0 to 1.2.8. What to do: Ledger Review lists it under "Spent withdrawals saved with $0 proceeds": clear its proceeds (it's then valued from the price) or type what you received. Made a Sell that way, it's a $0 sale Ledger Review doesn't list: look in Transactions for a Sell with no proceeds and enter what you received.
- A sale edited to $0. Setting a sale's gross proceeds to 0 kept its old proceeds and gain. Versions 0.8.0 to 1.2.8. What to do: if you did that and it came back with its old figure, set it to 0 again.
- A Buy, or bitcoin, with no cost. Through the API or the AI connector, a Buy could be saved without its cost basis, and a dollar deposit moved into Wallet or Exchange BTC kept its dollar figure (often $0) as the coins' cost: their later sale was all gain. Versions 0.8.0 to 1.2.8. What to do: Ledger Review lists "Buys with a $0 or blank cost basis" and "BTC deposits (not income or a rebate) with a $0 or blank cost basis": enter what each cost. Ledger Review doesn't list one moved with another dollar figure: if you moved a dollar deposit into Wallet or Exchange BTC through the AI connector or a program of yours, check its cost basis.
- A sale edited through the API with blank proceeds was saved as a $0 sale, and one with proceeds below its fee was kept. Versions up to 1.2.8; only programs of your own, never the app or the AI connector. What to do: compare such sales with your exchange's records.
- Ledgers from before 0.8.0. An old Spent opened in the edit form with proceeds of $0, so a save made it a $0 sale; an old Sell opened with gross proceeds of $0, and typing its net there took the fee off a second time; an old withdrawal changed into a Sell through the AI connector or the API got proceeds too high by its fee. Versions 0.8.0 to 1.2.8, only before any recalculation. What to do: if you saved one so, Ledger Review lists a $0 spend; open an old sale you edited, or an old withdrawal you made a Sell, and check that its Gross Proceeds (USD) is what it brought before the fee.
- Applying the hour's prices during an edit. A transaction edited while Ledger Review applied the hour's prices could get the value worked out for its old amount or hour. Version 1.2.8 only. What to do: only if you did that, open it and clear its value to price it again.
- A dollar withdrawal listed as a gift of bitcoin in the Complete Tax Report, when a bitcoin purpose was left in the form. Every version; never on Form 8949. Nothing to do.
- Your own Mempool's address changed during a price lookup. For 10 minutes, the old Mempool's prices could be used and stored. Version 1.2.8 only. What to do: only if you changed it because its prices looked wrong, check the values priced from your Mempool since then.
- A price under one cent stored as $0 (1.2.8). Versions 0.9.2 to 1.2.7; no such price is known. What to do: if you ever saw a value "From the price" at $0.00, type it.
- Inherited bitcoin (1.2.8). Recorded as My BTC or Gift, as earlier versions offered, it could print wrong figures: a sale within a year of the death short-term, or a Gift's basis the person's own cost. Versions before 1.2.8. What to do: edit each such deposit to the Source Inherited, with the date of death and its value that day. A deposit saved before 1.1.0 with the source "inherited" follows the rules from the next recalculation; Ledger Review lists any without a date of death.
- Four fixes to this version's new duplicate rules for the AI connector affected no released version: nothing to do.
Privacy (fixed)
- A price choice made without asking (1.2.8; versions 1.2.0 to 1.2.7). Switching Price Source & Privacy to Decide in BitcoinTX instead, or running Set Login Credentials or a hand-run command while it was set, could save Public price sites as your choice in the app, used without the action's Tor. What could have been sent: requests from your server's address to public sites for Bitcoin's price and the block height; never dates, amounts or anything from your ledger. What to do: confirm or change the choice when BitcoinTX asks once, or check Settings > Privacy & Network.
- A command run by hand in the service's shell read the choice stored in the app, not the action's: with Use Tor, it asked public price sites without Tor; otherwise it followed an older choice made in BitcoinTX's Settings. Versions 1.2.0 to 1.2.8. It now asks nobody unless it has the action's settings; the Recalculate Ledger action always had them.
- A price lookup under way while you changed the price settings could still ask a public site, without Tor, after you chose Nobody in Settings > Privacy & Network. Now each request follows the settings in use when it's sent. Versions 0.9.2 to 1.2.8. No figure is affected.
New
- The price history through Tor. Bitstamp refuses BitcoinTX's requests through Tor. Once it has, BitcoinTX's Dashboard asks once whether to download the price history without Tor: only Bitstamp's fixed history blocks, the same for every install and naming none of your dates; Bitstamp then sees this server's address. The live price and everything else stay on Tor. You can change the answer in Settings > Privacy & Network.
- Prices at the hour (1.2.8). Values BitcoinTX fills in from the BTC price use the price when the transaction's hour began: a blank income or rebate value, a Spent's proceeds, a network fee's value, and now a gift's, donation's or lost coins' value left blank. When your choice allows public price sites, BitcoinTX downloads Bitstamp's hourly prices from 2013 once (about 3 MB). Nothing already saved changes: Ledger Review lists values priced at the day that the hour would change. The AI connector now also says which price, hour and source a value it filled used.
- One price choice (1.2.8). Price Source & Privacy offers My Mempool on this server, Public price sites, Nobody, or Decide in BitcoinTX instead, with Use Tor; one price card in the app says where prices come from.
- Inherited bitcoin and consolidations (1.2.8): the deposit source Inherited (its cost basis is its value on the date of death, and every sale is long-term), and a transfer within the same wallet that records only its network fee: if you left a past consolidation's fee out, you can add it now.
- Trust this server (1.2.8). With Decide in BitcoinTX instead, a Mempool on another home server at its https address can be trusted from the price card.
- Delete All asks first. It says what goes, offers to download a backup, and deletes only once you type DELETE, after keeping a copy of the database.
- Tax notes in the Complete Tax Report: the answer to Form 1040's digital asset question, each gift's or donation's cost basis and term, and when Form 8283 or 709 may apply.
- Times on screen follow your device's clock; the tax timezone still decides tax years and Form 8949's dates.
Security and smaller fixes
- BitcoinTX no longer runs as root in its container, but as its own user; the update hands its files over. Nothing to do.
- StartOS no longer keeps a copy of your generated BitcoinTX password, only that you set one. Nothing to do.
- Hardening from this version's security reviews; a recalculation by the AI connector, or its import of an entry dated before your latest, now keeps a backup copy first, as its edits do; an unexpected error says so in plain words, without technical details.
- Set Login Credentials and Recalculate Ledger say why they failed, in your language, with no time limit; a dismissed Recalculate Ledger task no longer comes back at every restart.
- A dollar transfer's Amount (To) now counts: with a fee, both dollar balances were off by it (no tax figure). If your Bank or Exchange (USD) balance differs from your statements, open each dollar transfer and set what left and what arrived.
- From 1.2.8's security review: logging out ends that session for every copy of its cookie; a restore keeps this install's login, AI key and price settings; every request has limits on size and time.
- The River import's preview lists every row of the file it can't read; before, only the first ten errors showed, so a row left out could go unseen (a transaction missing from the ledger). If a River import showed errors, preview the same file again: rows already imported show as already in the ledger.
- In Safari, a deposit switched to or from Inherited saves again (in 1.2.8, Save did nothing).
- The sidebar's calculator now works as a pocket calculator, and its Sats Converter counts to the satoshi; nothing either shows is saved.
- BitcoinTX runs on Python 3.13. Many more small fixes are in the changelog.
Known issues (none can make a figure wrong; for the first maintenance update)
- A save made while a long import holds the database says "Something unexpected went wrong", not that it's busy: nothing was saved; save again.
- The CSV import's preview counts a row with two errors as two rows.
- When the River import refuses a typed cell, it doesn't say which row or column.
- An amount of 10^21 BTC or more, far beyond what exists, is shown wrongly.
- The AI connector's note on a dollar row that may already be recorded calls the dollars BTC.
- The sidebar's Sats Converter can show one satoshi too few when a dollar amount comes to exactly halfway between two satoshis; nothing it shows is saved.
- Saving the tax timezone in Settings, when it fails, says only "Could not save the timezone.", not why; nothing is saved.
- With your own Mempool, a second price lookup made while the first is still downloading your Mempool's history finds no price; trying again a moment later works (nothing is saved without a price, never at $0).
- The browser's Back button leaves an unsaved transaction without asking "Discard changes?", and what you typed is lost; Escape and a click outside the panel do ask.
About this release
1.2.9 is the stable version of BitcoinTX 1.x. From now on, 1.x gets maintenance updates: bug and security fixes, each year's IRS forms and the price history's updates, and the few small improvements already planned for it. New features go into BitcoinTX 2.0, now in the works, which adds several wallets, exchanges and bank accounts, each wallet and exchange with its own cost-basis lots. Because 2.0 changes how the ledger is stored, it will be tested as a beta first, on GitHub pre-releases, then on Start9's Community Beta once it's ready, before it replaces 1.x. We don't promise dates; until then, 1.2.9 is the version to use.
SHA256 Hashes
ebf2c5ff98eb68196f5f04ba057d9f09beeddca6b91cedf4ae2efaccae3a8cbd btctx_aarch64.s9pk
1d996ea651eb1a1b55f12beec3b4d99258946724ec59c956aba0c8b51c16af69 btctx_x86_64.s9pk