BitcoinTX

Bitcoin taxes, worked out on your own machine.

BitcoinTX keeps a double-entry ledger of every buy, sell and move, matches each sale to the coins it came from, and fills in IRS Form 8949 and Schedule D. It runs on your Mac, your StartOS server or in Docker. No account, no cloud, free and open source.

Tax forms for the United States (IRS). BitcoinTX doesn't give tax advice; check its output before you file.

Your whole stack, one screen.

Bank, exchange and cold-storage balances, what your coins cost, what you've gained, and what you earned in bitcoin.

BitcoinTX dashboard: account balances, total BTC, cost basis, unrealized and realized gains, income and fees
Transactions list showing sells with their gain and holding period
Every transaction, with the gain and holding period of each sale.
Reports page: complete tax report, IRS forms, transaction history
Pick a tax year and export the forms.

What it does

Built for bitcoin only, and for the way bitcoiners actually move coins: buy on an exchange, withdraw to cold storage, spend or sell later.

RecordEnter what happened once; the ledger works out the rest.

Five kinds of transaction

Deposit, withdrawal, transfer, buy and sell, across your bank, exchange cash, exchange bitcoin and your own wallet. Every one is a balanced double entry.

FIFO lots per account

Each sale uses the oldest coins in that account. Moving coins to cold storage keeps their purchase date and cost, so the holding clock and the basis travel with them.

Network fees handled

The on-chain fee of a transfer or withdrawal is recorded as its own small disposal, valued at that day's price.

Backdate freely

Every add, edit or delete recalculates the whole ledger in date order, so a forgotten purchase from two years ago lands in the right place.

Imports

River's CSV export, a generic CSV to start a new ledger, or an AI assistant that turns emails and wallet histories into entries.

Income at its real value

Bitcoin earned as pay, interest or rewards is valued at that day's price, which is both its cost basis and the income you report.

FileForms your preparer, or you, can use as they are.

Form 8949 and Schedule D

The official IRS PDFs, filled in and flattened, one sheet per box, with totals carried to the right Schedule D lines.

1099-DA boxes

From tax year 2025, exchange sales go in the boxes for Form 1099-DA. If your broker's form says something different for a sale, record that on the sale and the box follows.

Complete tax report

Gains, income, fees and year-end balances in one PDF, plus your transaction history as a spreadsheet.

Your tax timezone

Decides which year a late-night December 31 sale belongs to, the dates on the forms, and the day a holding turns long-term: after one full year, as the IRS counts it.

CheckSee what's off before it reaches a form.

Ledger review

A read-only list of entries worth a second look: a spend saved at $0, a deposit with no cost basis, a fee valued far from the day's price, and every figure a recalculation would change.

Stored price history

Past daily prices are kept on your machine. Nothing is ever valued at today's price or at $0 by accident: with no price, BitcoinTX asks.

Encrypted backups

Download the whole database as a password-protected backup and restore it on any install. Upgrades keep a copy of the old database first.

Keep privateYour financial history is nobody else's business.

Runs where you are

On your Mac, your StartOS server or your own Docker host, behind your own login. There's no BitcoinTX account and no server of ours.

Your own node for prices

Take the live price, block height and past prices from your own mempool server, from public sites, or from nowhere. Nothing is contacted until you choose. On StartOS, one action connects the Mempool on the same server, and public sites can go over Tor.

Lookups that don't give away your dates

Past prices are stored with your ledger. From public sites, the whole daily history comes in one download that's the same for every install, so no request names one of your dates. A VPN or a Tor proxy hides your IP address too.

Nothing phones home

No analytics, no trackers, fonts shipped with the app. The database and backups are readable by you alone.

Or just describe it to an AI.

BitcoinTX includes an MCP server, so an AI app on your computer can read your ledger and enter transactions for you. It shows a preview with duplicates flagged and the resulting gains, and saves only after you confirm.

  • Here's my River email: "You bought 0.00231 BTC for $150.00 (fee $1.49) on Mar 3"
  • I withdrew everything from the exchange to my Coldcard on March 10, network fee 1,800 sats
  • Got paid 250k sats for a logo design on May 2, straight to cold storage

Pick the model with care. The AI's model reads what BitcoinTX hands it and whatever you paste. With a cloud AI such as Claude or Grok, that goes to the provider. To keep it on your computer, use an app that runs a local model, such as LM Studio or Goose with Ollama.

  • Works with Claude Desktop, Claude Code, Grok Build, LM Studio, Goose and other MCP apps.
  • Settings has a setup prompt: paste it into your AI app and it sets itself up.
  • AI access is off until you turn it on, and the AI uses a key you can revoke, never your password. The key can read and enter transactions; it can't log in, restore a backup or delete everything.
  • The connector (btctx-mcp on PyPI) is pinned to your BitcoinTX version, so nothing new is fetched behind your back.
Settings: Connect an AI Assistant, with the privacy note, the AI access switch and the setup prompt
Settings, Connect an AI Assistant, in the Mac app.

Download

Every link below fetches the latest release. What changed: release notes.

Mac

A normal Mac app. Your data stays in your user folder.

  1. Open the .dmg and drag BitcoinTX to Applications.
  2. The app isn't signed by Apple yet. The first time, Control-click it and choose Open. On macOS 15 or later, open it once, then go to System Settings, Privacy & Security, and click Open Anyway.

StartOS

For a Start9 server: runs next to your node, reachable from your devices.

  1. In StartOS, open Sideload and upload btctx.s9pk.
  2. Run Show Credentials, then Price Source & Privacy: your own Mempool, public sites (optionally over Tor), or nothing.
  3. Start the service and open its Web UI.
  4. Package source: BTCTX-StartOS.

Docker

Linux, Windows or Mac; amd64 and arm64.

docker run -d -p 8080:80 -v btctx-data:/data ghcr.io/digimonk73/btctx-mcp:latest
  1. Open http://localhost:8080.
  2. Your data lives in the btctx-data volume. Pin a version with :vX.Y.Z.

First run

A new install starts with the login admin / password. The first screen has you set your own before anything else.

Upgrading

Install the new version over the old one. It upgrades your database by itself and keeps a copy of the old one.

From source

Python 3.10+ and Node 20+. Instructions in the README.