fundarr

module
v0.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 20, 2026 License: AGPL-3.0

README

Fundarr

Prowlarr for your money.
Your exchanges and wallets, read once, checked, and sent to the apps you use.

Checks Docker image AGPL-3.0

Paid portfolio apps sell this sync. Fundarr is free, self-hosted, and your keys never leave your server.

  • Sources: Binance, OKX, Kraken, Coinbase, Bitpanda, and any wallet (Ledger, Trezor, MetaMask, Phantom…), all read-only.
  • One checked history: Fundarr replays it against the real balances, fills the gaps APIs leave, and pairs transfers between your accounts.
  • Apps: Wealthfolio and Ghostfolio receive it after every sync; Cairn, Koinly or your own app read it.

Quick start

1. Run it

docker compose up -d   # with the compose.yaml of this repo

or docker run -d -p 9494:9494 -v fundarr:/data ghcr.io/alexis-marcel/fundarr. It is one small container (a Go binary and a SQLite file) and runs on a Raspberry Pi.

2. Add a source. Open http://localhost:9494, create your account, then Sources → Add source. Each form shows how to create a read-only key.

3. Connect an app. Apps → Add app: Wealthfolio, Ghostfolio, Cairn, or any other app.

Just looking? docker run --rm -e FUNDARR_DEMO=1 -p 9494:9494 ghcr.io/alexis-marcel/fundarr serves a made-up portfolio, no account needed.


Every source is checked against its real balances.Adding a Ledger, with a guide for each kind of account
Wallets: a guide per app, every account in one source.
Apps Fundarr sends to, and apps that read it.An app's API address and token, with a curl example
Any app connects with an address and a token.

Sources

Binance Since 2017: trades, converts, Auto-Invest, card purchases, Earn and staking, Pay, P2P. Import the export once to fill what the API forgot.
OKX Since 2021, older trades from OKX's archives.
Kraken The whole ledger.
Coinbase The whole history, Advanced Trade included.
Bitpanda Crypto, stocks and ETFs, metals, savings plans.
Wallet Bitcoin, Litecoin, Dogecoin, Bitcoin Cash, Ethereum and EVM chains, Solana, Tron, Cardano, XRP. Paste a public key or an address, never a recovery phrase.

Details and limits per platform: docs/sources.md. Next: Trade Republic.

Apps

App How
Wealthfolio Fundarr sends new activities after every sync, through Wealthfolio's MCP endpoint (WF_MCP_ENABLED=true and an access token).
Ghostfolio Fundarr sends new activities through its import API, with your security token.
Cairn Reads Fundarr: where your crypto stands, its progress, and the French tax form 2086.
Koinly, spreadsheets Download the history as CSV (Settings → Export), in Fundarr's or Koinly's format.
Your own app Reads the API with a token.

Your own app

Apps → Add app → Other app gives an address and a token:

curl -H "Authorization: Bearer fdr_…" http://localhost:9494/api/v1/portfolio

The read API serves every activity, the holdings, the portfolio and its history, and the French 2086 form, already computed. An app with its own database stays in sync through a changes feed (/api/v1/changes, with an optional notification), and a Go app can reuse Fundarr's cost, portfolio and tax code (pkg/). Develop against the demo (FUNDARR_DEMO=1, token fdr_demo). Start with Build an app; the full contract is in api.md and openapi.yaml. Cairn is a complete example.

What Fundarr does

  • Balance check: the history is replayed and compared with what each platform reports, asset by asset.
  • Corrections: what an API forgot becomes a correction valued at that day's price, held 48 hours in case the history catches up.
  • Statements: a platform's own export replaces the corrections with the real trades.
  • Transfers: a withdrawal and the deposit it became are paired, so apps see a move at cost, not a sale.
  • Prices: daily prices and exchange rates from public data, no key needed.
  • Delivery: each activity is sent once; failures are retried.

More in How it works.

Versions

Releases are tagged (v0.1.0) and published as images with the same tag (ghcr.io/alexis-marcel/fundarr:0.1); latest follows main. The API stays compatible within /api/v1 (details); release notes.

Configuration

None is needed. Sign-in (password, OpenID Connect, reverse proxy), the data folder and the other settings are in docs/configuration.md. Back up /data whole: it holds the database and the key that encrypts your API keys.

Security

  • Use read-only keys. Fundarr refuses a key it can tell allows trading or withdrawals.
  • Keys are encrypted at rest (AES-256-GCM) and never sent back to the browser.
  • Restrict keys to your server's IP when the platform allows it.
  • Keep Fundarr behind your VPN or SSO; it does not need to be public.

Develop

go test ./...
FUNDARR_DEMO=1 go run ./cmd/fundarr       # API on :9494
cd web && npm install && npm run dev      # UI on :5173, API proxied to :9494

A new source or app is one Go package: see CONTRIBUTING.md.

License

AGPL-3.0. If you run a modified Fundarr for others, share your changes.

Coin icons come from cryptocurrency-icons (CC0) and ship with Fundarr, so no third party learns which coins you hold.

Directories

Path Synopsis
cmd
fundarr command
Fundarr: one place that connects your exchanges, brokers and wallets, and keeps your portfolio tools fed with their history.
Fundarr: one place that connects your exchanges, brokers and wallets, and keeps your portfolio tools fed with their history.
Package docs holds the OpenAPI description of the read API, served by Fundarr at /api/v1/openapi.yaml.
Package docs holds the OpenAPI description of the read API, served by Fundarr at /api/v1/openapi.yaml.
internal
demo
Package demo makes up a crypto portfolio for FUNDARR_DEMO=1, so apps can be built on the read API without real accounts: three sources (Binance, Kraken, a Ledger) from 2023 to today, with monthly buys, staking, moves to the Ledger, a swap to USDC and sales for euros.
Package demo makes up a crypto portfolio for FUNDARR_DEMO=1, so apps can be built on the read API without real accounts: three sources (Binance, Kraken, a Ledger) from 2023 to today, with monthly buys, staking, moves to the Ledger, a swap to USDC and sales for euros.
dest
Package dest defines where normalized activities are delivered (portfolio trackers, budgeting apps, files) and keeps the registry of destinations.
Package dest defines where normalized activities are delivered (portfolio trackers, budgeting apps, files) and keeps the registry of destinations.
dest/ghostfolio
Package ghostfolio delivers activities to a Ghostfolio server through its REST API (POST /api/v1/import), signed in with the user's security token (POST /api/v1/auth/anonymous gives a JWT, renewed when it is refused).
Package ghostfolio delivers activities to a Ghostfolio server through its REST API (POST /api/v1/import), signed in with the user's security token (POST /api/v1/auth/anonymous gives a JWT, renewed when it is refused).
dest/wealthfolio
Package wealthfolio delivers activities to a Wealthfolio server through its MCP endpoint (import pipeline: validate, then commit as one run).
Package wealthfolio delivers activities to a Wealthfolio server through its MCP endpoint (import pipeline: validate, then commit as one run).
engine
Package engine runs syncs (source → history) and pushes (history → destinations), on demand and on a schedule.
Package engine runs syncs (source → history) and pushes (history → destinations), on demand and on a schedule.
secret
Package secret encrypts connector credentials at rest (AES-256-GCM) and derives the other keys Fundarr needs from one master key.
Package secret encrypts connector credentials at rest (AES-256-GCM) and derives the other keys Fundarr needs from one master key.
server
Package server is Fundarr's HTTP API and the web UI it serves.
Package server is Fundarr's HTTP API and the web UI it serves.
source
Package source defines what a connector to a platform (exchange, broker, blockchain) must do, and keeps the registry of available connectors.
Package source defines what a connector to a platform (exchange, broker, blockchain) must do, and keeps the registry of available connectors.
source/binance
Package binance reads a Binance account's history and balances with a read-only API key: deposits and withdrawals, spot trades (delisted pairs included), converts, card and bank purchases, dust conversions, distributions (airdrops, token swaps), Auto-Invest, Simple Earn rewards, ETH/SOL liquid staking, Binance Pay and P2P. Binance is treated as one account: moves between its internal wallets (spot, funding, earn) are not activities.
Package binance reads a Binance account's history and balances with a read-only API key: deposits and withdrawals, spot trades (delisted pairs included), converts, card and bank purchases, dust conversions, distributions (airdrops, token swaps), Auto-Invest, Simple Earn rewards, ETH/SOL liquid staking, Binance Pay and P2P. Binance is treated as one account: moves between its internal wallets (spot, funding, earn) are not activities.
source/bitcoin
Package bitcoin reads a Bitcoin wallet from its extended public key (xpub, ypub or zpub): addresses are derived locally, history and balances come from an Esplora API (mempool.space by default, or your own instance).
Package bitcoin reads a Bitcoin wallet from its extended public key (xpub, ypub or zpub): addresses are derived locally, history and balances come from an Esplora API (mempool.space by default, or your own instance).
source/bitpanda
Package bitpanda reads a Bitpanda account through the Public API (https://api.public.bitpanda.com/v1, docs.public.bitpanda.com) with a key limited to the Balances and Transaction scopes.
Package bitpanda reads a Bitpanda account through the Public API (https://api.public.bitpanda.com/v1, docs.public.bitpanda.com) with a key limited to the Balances and Transaction scopes.
source/cardano
Package cardano reads a Cardano wallet from its stake address: every address of a Shelley wallet shares the stake credential, so the account's history, staking rewards and balance come from it, through a Koios API (api.koios.rest by default, free, an API key is optional).
Package cardano reads a Cardano wallet from its stake address: every address of a Shelley wallet shares the stake credential, so the account's history, staking rewards and balance come from it, through a Koios API (api.koios.rest by default, free, an API key is optional).
source/coinbase
Package coinbase reads a Coinbase account (the retail app and Advanced Trade) with a view-only CDP API key.
Package coinbase reads a Coinbase account (the retail app and Advanced Trade) with a view-only CDP API key.
source/evm
Package evm reads an Ethereum-compatible wallet (Ledger, MetaMask…) from its public address: native coin and ERC-20 history and balances, on one or more networks.
Package evm reads an Ethereum-compatible wallet (Ledger, MetaMask…) from its public address: native coin and ERC-20 history and balances, on one or more networks.
source/kraken
Package kraken connects a Kraken account through the spot REST API with a read-only key ("Query Funds" and "Query Ledger Entries").
Package kraken connects a Kraken account through the spot REST API with a read-only key ("Query Funds" and "Query Ledger Entries").
source/okx
Package okx connects an OKX account through the v5 REST API with a read-only key.
Package okx connects an OKX account through the v5 REST API with a read-only key.
source/solana
Package solana reads a Solana wallet (Phantom, Solflare, Ledger…) from its public address: SOL and SPL token history and balances.
Package solana reads a Solana wallet (Phantom, Solflare, Ledger…) from its public address: SOL and SPL token history and balances.
source/tron
Package tron reads a Tron wallet (Ledger, TronLink…) from its public address: TRX and TRC-20 history and balances.
Package tron reads a Tron wallet (Ledger, TronLink…) from its public address: TRX and TRC-20 history and balances.
source/wallet
Package wallet is one source for a whole self-custody wallet (a Ledger, a Trezor…): every account it holds, one key or address per line, each read on its own blockchain by the matching connector.
Package wallet is one source for a whole self-custody wallet (a Ledger, a Trezor…): every account it holds, one key or address per line, each read on its own blockchain by the matching connector.
source/xrp
Package xrp reads an XRP Ledger account (Ledger, Xaman…) from its classic address: XRP and issued-currency history and balances.
Package xrp reads an XRP Ledger account (Ledger, Xaman…) from its classic address: XRP and issued-currency history and balances.
store
Package store keeps Fundarr's state in one SQLite file: configured sources and destinations (secrets sealed), the normalized activity history, the latest balances, what was delivered where, and the run log.
Package store keeps Fundarr's state in one SQLite file: configured sources and destinations (secrets sealed), the normalized activity history, the latest balances, what was delivered where, and the run log.
pkg
api
Package api holds the JSON types of Fundarr's read API (/api/v1, see docs/api.md), so a Go app decodes the answers straight into them, and turns a copy of the history into what pkg/model and pkg/portfolio take:
Package api holds the JSON types of Fundarr's read API (/api/v1, see docs/api.md), so a Go app decodes the answers straight into them, and turns a copy of the history into what pkg/model and pkg/portfolio take:
model
Package model is the common language between sources and destinations: every platform's history is normalized into Activities, every platform's holdings into Balances.
Package model is the common language between sources and destinations: every platform's history is normalized into Activities, every platform's holdings into Balances.
portfolio
Package portfolio values the crypto held across every source: what it is worth, what went into it and what it gained, now and day by day, and the French tax on its disposals (formulaire 2086).
Package portfolio values the crypto held across every source: what it is worth, what went into it and what it gained, now and day by day, and the French tax on its disposals (formulaire 2086).
price
Package price values assets on a given day, in a given currency, from free public market data: Binance and OKX daily candles for crypto, the European Central Bank's reference rates (through Frankfurter) between currencies.
Package price values assets on a given day, in a given currency, from free public market data: Binance and OKX daily candles for crypto, the European Central Bank's reference rates (through Frankfurter) between currencies.
Package web holds the built UI (web/dist, produced by `npm run build`).
Package web holds the built UI (web/dist, produced by `npm run build`).

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL