pfm keeps all your investments β shares, ETFs, crypto and other holdings β in one place, running on your own machine. Daily prices, one base currency, real money-weighted returns, dividend & risk analytics, and Spanish tax tooling. Your data and keys never leave your server.
The metrics and tools I actually wanted from a portfolio tracker β without handing my financial data to anyone.
Paste any broker statement β any language, any format β and a model extracts the trades and cash deposits/withdrawals. No column mapping. Plus ready-made CSV/XLSX importers for IndexaCapital, MyInvestor, Mintos (P2P), Coinbase and Portfolio Dividend Tracker.
Stocks, ETFs, index funds, crypto, bonds, commodities and cash β across multiple broker "portfolios" β plus P2P/savings interest income and off-brokerage assets (cash, property, mortgage) for a true net-worth picture.
Money-weighted IRR that accounts for when you added money, total return vs cost basis, and benchmark comparison against an index.
Income by month and year, yield-on-cost, projected forward annual income per holding and an income-by-calendar-month view.
Ask about your portfolio in plain language β it reads your real holdings and history. Plus a research workbench: fundamentals, a fair-value calculator, a sell calculator, and a downloadable report per ticker.
Allocation by type, sector and currency, a concentration index, plus maximum drawdown, volatility and the Sharpe ratio from daily snapshots.
FIFO realised gains per financial year and a Spanish IRPF savings-base (base del ahorro) estimate, plus a per-lot realised-gains report you can export to CSV β something no international tool does well.
Full compatibility with Portfolio Dividend Tracker (PDT) v2 β a popular dividend tracker that pulls from a handful of brokers or a Google Sheet. pfm reads and writes that same Google Sheet (and the PDT XLSX), so the two stay in sync.
FIRE goal tracking with projections, a rebalancing calculator, a watchlist with price alerts and an LLM research agent.
Self-hosted. The code is public; your database, API keys and amounts stay in local, gitignored files that never get committed.
Screens from the bundled demo account β fictional sample data, not a real portfolio. Click any to enlarge.
pfm ships with Docker Compose, so a self-hosted instance is a few commands away.
localhost:8080Log in with your API key, add a portfolio, and import your transactions from a file, pasted text, or a Google Sheet.# 1 Β· clone + configure git clone https://github.com/alexgoldhoorn/pfm.git cd pfm cp .env.example .env.local # set SERVER_API_KEY and GEMINI_API_KEY in .env.local # 2 Β· start docker compose --profile dev up -d --build # 3 Β· open http://localhost:8080
python scripts/create_demo_account.py --fresh then
docker compose -f docker-compose.demo.yml up -d spins up a full demo with
realistic sample data at localhost:8081.
Holdings, transactions, imports, analytics, tax reports, bookings, watchlist, goals and Google Sheets sync β everything the web client does runs through FastAPI. Browse the full, auto-generated reference.
Open the API reference β