DE EN ES FR IT TH
Guide · English

Bitcoin Portfolio — Guide

Quick guide to the core features of the BTC-Tracking app: CSV import via the 3-step wizard, managing transactions & positions in Data Management, and CSV export. The app starts on the Holdings View — for import, transactions and positions, switch to “Data Management” in the “Visualization” menu at the top.

Usage / Setup — Download & Installation → Visualizations →
01 / 07

Import CSV

Select a file via “Import CSV”. The import runs as a wizard with three steps: Mapping, Review, and Status.

1. Mapping

The app detects the columns automatically and suggests a mapping — e.g. for CoinTracking exports, wallet export formats, or your own files with different column names. A live preview shows immediately how the detected rows will be interpreted.

  • Required fields (marked with *): Type, Date, Wallets & Exchanges, Buy Amount, Buy Currency, Sell Amount, Sell Currency must each be mapped to a CSV column.
  • Fixed Wallet / Exchange: overrides the column mapping and sets the same position for all rows — useful for files that only cover a single exchange. If no exchange is mapped, the area is highlighted.
  • Type value mapping: every raw value that occurs in the file (e.g. Withdrawal, Staking) is mapped to a specific internal type — or set to – ignore – to skip those rows during import.
Step 1: Mapping dialog for CSV column mapping with auto-mapping
Step 1 — Mapping: automatic column mapping suggestion Click to enlarge ↗

2. Review

Every detected row is checked individually before the actual import. Color-coded rows indicate where a review makes sense — e.g. possible duplicates or invalid values. Multi-select lets you confirm, fix, or exclude rows from this import in bulk.

Step 2: Review table with color-coded row states
Step 2 — Review: check rows individually before import Click to enlarge ↗

3. Status

Summary of the import: how many rows were imported, skipped, or detected as duplicates. From here you go back to Data Management, where the imported transactions are immediately visible.

Step 3: Import status summary
Step 3 — Status: import result at a glance Click to enlarge ↗
Tip: Before the final import, it's worth checking the number of detected rows in the Mapping step — if it doesn't match the source file, check whether the delimiter or header row were detected correctly.
02 / 07

Custom CSV Format

Without the CoinTracking option, the app exports in its own format. This is also the format a manual CSV import expects without CoinTracking auto-mapping.

"typ","date","exchange","buyQty","buyCur","sellQty","sellCur","fee","feeCur","comment"
"Deposit","20.07.2026 16:53:27","Bitbox02","0.00490000","BTC","","","","EUR","Example transfer to own wallet"
"Withdrawal","20.07.2026 16:53:26","21 Bitcoin","","","0.00500000","BTC","0.00010000","BTC","Example transfer to own wallet"
"Trade","19.07.2026 16:53:26","21 Bitcoin","0.01000000","BTC","500.00","EUR","0.00000000","EUR","Example transaction"

Important: typ controls the booking type (Deposit / Withdrawal / Trade), buyQty/buyCur and sellQty/sellCur each describe what was bought and sold respectively.

Flexible detection: The mapping in step 1 also recognizes differing column names from other export formats (e.g. Time, Unit, Fee Unit, Transaction ID, Note), amounts given in satoshi are converted to BTC automatically, and date values with a timezone offset (e.g. 2026-07-20T16:53:27-03:00) are parsed correctly.
Example of an exported CSV file
Example CSV rows: Deposit, Withdrawal, Trade Click to enlarge ↗
03 / 07

Data Management

Positions and transactions are managed on the “Data Management” page. Tiles can be reordered by drag handle and collapsed/expanded — the order is saved.

Wallets & Exchanges

Table of all positions. Use “Add Wallet / Exchange” to create a new position — every exchange/wallet must be created once before the first booking. Clicking a row filters the transaction list to that position; a filter hides positions with no holdings.

All Transactions

Complete list of all bookings. “Add Transaction” opens a form for a single booking:

FieldMeaning
Quantity (BTC)Traded BTC amount, e.g. 0.1
Date & TimeTime of the transaction
TypeBUY or SELL
Fiat AmountValue in the trading currency, e.g. 5000
CurrencyTrading currency, e.g. EUR or USDT
Exchange rate to display currencyOnly relevant if trading and display currency differ
ExchangeChoose an existing position or create a new one via + New position…
Fees / Currency (fees)Trading fee including its own currency
Form: Add Transaction
Example: 0.1 BTC BUY for 5,000 EUR on exchange “21 Bitcoin” Click to enlarge ↗

Select one or more rows via checkbox to open the action menu:

ActionMeaning
Export SelectedExport only the checked rows as CSV
Pair TransfersLink two rows (deposit/withdrawal) as a matching wallet transfer
Change wallet or exchangeMove the position after the fact
Set Exchange RateCorrect the rate to the display currency
Not a duplicateConfirm a row detected as a duplicate and remove the marker
Mark as Solo TransferDeliberately flag a deposit/withdrawal that has no matching counter-booking
DeleteRemove the selected transactions

Color-Coded Rows

The background color of a row in the transaction list automatically indicates one of four states:

ColorMeaning
🟠 OrangeForeign currency without exchange rate — transaction in a currency other than the display currency, exchange rate is still at 1. Fix via “Set Exchange Rate”.
🟣 PurplePossible duplicate — date, type, and amount match an already existing transaction. Review and confirm via “Not a duplicate”, or delete the row.
🔵 BlueSolo transfer — deposit or withdrawal without a matching counter-booking on another position, deliberately marked as a standalone booking.
🔴 Dark redRecently imported — row comes from the CSV import of the current session, for quick review after importing.

The legend directly above the table shows the same four colors for quick reference.

Color-coded rows in the transaction list
Example of all four markers: recently imported, solo transfer, foreign currency without exchange rate, possible duplicate Click to enlarge ↗

Import History

Tile with all past CSV imports: date, file name, total row count, and how many of them were imported, detected as duplicates, or errored. Individual imports can be deleted from here.

Metrics & Charts: Performance, holdings, allocation, and gain/loss per purchase are no longer shown here — see the Holdings View instead.
Data Management: wallets & exchanges plus transaction list
Data Management: wallets & exchanges, transaction list with row actions Click to enlarge ↗
Data Management in card view on narrow screens
Responsive card view on narrow screens instead of table rows Click to enlarge ↗
04 / 07

Lock App

The lock icon in the header (next to “Actions” / “Visualization”) encrypts all positions and transactions with a password and removes the plaintext data from the database. Useful when the app is left unattended or the underlying machine isn't fully trusted.

FieldMeaning
PasswordEncryption password — required to unlock later
Confirm PasswordMust match exactly, otherwise locking is rejected
What happens when locking: All positions and transactions are encrypted with the password and removed from the database. From then on, the app shows a blocking “App Locked” dialog on every visit until the correct password is entered again — which also restores the data. Wrong attempts are throttled with an increasing delay.
🔒 Encryption: AES-256-GCM, the key is derived from the password via PBKDF2WithHmacSHA256 with 310,000 iterations and a random 16-byte salt. Each encryption uses a random 12-byte GCM nonce; the 128-bit auth tag detects a wrong password or tampered data on unlock.
Important: There is no password recovery. If the password is lost, the encrypted data cannot be restored.

Unlocking

While the app is locked, the “App Locked” dialog with a password field appears on every visit. After entering the correct password, the data is decrypted and restored.

Lost password: Use Reset app in the unlock dialog to reset the app if the password is no longer known. This permanently deletes all encrypted data and the app starts fresh, like a new install. Confirming requires typing DELETE.
Dialog for locking the app with password fields
“Lock App” dialog, opened via the lock icon in the header Click to enlarge ↗
“App Locked” dialog to unlock with a password or reset the app
“App Locked” dialog: enter password or reset via “Reset app” Click to enlarge ↗
05 / 07

Export CSV

Via “Export CSV” in the header you can export all transactions, or — after selecting rows in the table — only specific ones.

OptionMeaning
CoinTracking formatEnable the checkbox to export in the CoinTracking-compatible format instead of the app's own format
Password (optional)Leave empty → export as plaintext .csv. Set a password → encrypted .enc file
Export dialog with CoinTracking format and optional password
Export dialog: choose format and optionally encrypt with a password Click to enlarge ↗
06 / 07

More Features

The icon bar on the right of the header bundles global settings and tools that are available on every page.

Settings

The gear icon opens the settings dialog:

FieldMeaning
LanguageInterface language of the app
Display CurrencyFiat currency for all calculated values (holdings, gain/loss, …)
FontFixed to Inconsolata and not changeable while Einundzwanzig Mode is active
Tax cutoff date (holding-period exemption ends)For coins bought on or after this date, the 1-year tax-free holding period no longer applies. Leave empty to disable. Informational only, not tax advice.

BTC Price

The price display on the left of the header can be manually overridden by clicking on the value — handy when no current price can be loaded.

Offline Mode

The Wi-Fi icon toggles offline mode. While active, the app doesn't fetch price data from the internet automatically — the price can still be set manually. The setting is stored locally in the browser.

Actions Menu: Backup & Reset

Besides CSV import/export, the “Actions” menu contains a full database backup, independent of the CSV export:

ActionMeaning
Create BackupBacks up positions, transactions, import history, and all price data (daily, monthly, and yearly prices) as JSON. Password optional — leave empty for a plain file.
Restore BackupDeletes ALL current positions, transactions, import history, and price data, and replaces them with the restored backup. Cannot be undone.
Actions menu with Reset app, Import/Export CSV, and Create/Restore Backup
Actions menu: Reset app, CSV Import/Export, Create/Restore Backup Click to enlarge ↗
Careful with “Reset app”: The entry in the Actions menu deletes all data immediately after a simple confirmation — unlike the reset in the “App Locked” dialog (see step 04), which requires typing the word delete to confirm. Consider making a backup first before clicking it.
07 / 07

Einundzwanzig Mode

The “21” icon in the header switches to an alternative color scheme with its own font (Inconsolata) and a scrolling ticker with Bitcoiner sayings. While the mode is active, the regular light/dark toggle and the font selector in Settings are locked.

Einundzwanzig Mode with its own color scheme and ticker
Einundzwanzig Mode: dedicated color scheme, font, and ticker in the header Click to enlarge ↗
Named after and inspired by the German-language Bitcoin podcast einundzwanzig.space (“einundzwanzig” is German for “twenty-one”).