docs/about/privacy.md
Rama main · réplica de lectura del repositorio original.
# Privacy
This app exists partly because the alternative is typing your entire financial
position into somebody else's website. So it is worth being precise about what
it does, rather than gesturing at "privacy-focused".
## What leaves your machine
**Ticker symbols, to public market-data services**, and from late 2027 a request
for the published Consumer Price Index, which names the statistic and nothing
else. That is the complete list.
To fetch a price, the app asks a provider what `ALPHA.AX` closed at. It does not
say how many you hold, what you paid, when you bought, who you are, or that the
question relates to a portfolio at all. A provider sees the same request from
someone idly checking a price.
Providers used by default:
| What | Who | Why them |
| --- | --- | --- |
| Prices, FX, distributions | Yahoo Finance (via `yfinance`) | Broad free coverage including ASX |
| FX fallback | Frankfurter | Central-bank rates, no key, no quotas |
| Crypto fallback | CoinGecko | AUD prices natively, no key |
| The CPI, from the September 2027 quarter | Australian Bureau of Statistics | The index the 2027 capital gains rules use |
You can see exactly which source served each figure — the `source` column is
stored per row, and the dashboard says so when a fallback was used.
## What never leaves
- **Holdings, quantities, prices paid, balances, gains.** Never transmitted.
- **Dividend statements.** Parsed by `pdfplumber` in your own process. No cloud
OCR, no LLM, no upload. This is a hard constraint in the code, not a setting.
- **Broker CSV exports.** Parsed locally, previewed, then written to your
database.
- **Anything at all, if you turn the price feed off.** Set
`price_feed.enabled: false` and the app makes no outbound requests
whatsoever, apart from signing in through a single sign-on provider, if you
set one up. You keep the app; you enter prices yourself.
## No telemetry
No analytics. No crash reporting. No usage statistics. No update check. No
outbound request that is not fetching a price you asked for, or the CPI.
There is no build flag or setting for this, because there is nothing to turn
off.
## Your data is a file
By default the whole database is one SQLite file. Copy it, back it up, open it
with `sqlite3`, delete it. Nothing is held anywhere else, and there is no
account to close.
If you point it at Postgres instead, the same applies to your database.
## What this does not protect against
Said plainly, because a privacy page that only lists good news is not useful:
- **Anyone who can read the database file can read everything.** Holdings,
session tokens, TOTP secrets. Per-user encryption would need a key derived
from your password, which would lock out the price feed and the backups. The
boundary is "can reach the machine", not "has an account" — see
[the security model](security.md).
- **Traffic is unencrypted unless you put TLS in front of it.** On a home LAN
over plain HTTP, anyone on that network can read your pages.
- **A hosting provider or tunnel sees what passes through it.** If you expose
the app through a service that terminates TLS on your behalf, it can see your
traffic in the clear at its edge.
- **The people you share a portfolio with can see it.** That is the point of
sharing, but it is worth stating: there is no partial visibility.