Security
What protects your data, what does not, and how to tell us if we got something wrong.
Effective September 11, 2026.
Report a vulnerability
Please report privately — never in a public issue. Use GitHub's private vulnerability reporting on the repository's Security tab, or email security@dohflow.app. Full terms, including response targets and safe harbor, are in SECURITY.md and security.txt.
You may publish after 90 days whether or not a fix exists. Good-faith research will not be met with legal threats. There is no bug bounty — this is an unfunded project and it would be dishonest to imply otherwise.
At rest
- SQLCipher encrypts the vault database.
- Argon2id derives the key from your passphrase — memory-hard, so parallel attack hardware buys less than it would against a simpler function.
- AES-256-GCM wraps key material.
- Keys are zeroed from memory after use.
- Backups are encrypted, and the restore path is tested as part of releasing.
In transit
Almost nothing is in transit. The app makes two kinds of outbound request — optional bank refresh to SimpleFIN, and a release check to GitHub — both over TLS. See Privacy for the exhaustive list.
The build
- Signed with an Apple Developer ID and notarized.
- Every release publishes a SHA-256 checksum — how to verify.
- Hardened runtime enabled.
- Logs are checked by CI for leaked financial data, so a debug log cannot quietly contain your balances.
What this does not protect against
Stating the limits plainly is part of a security page being useful:
- A compromised Mac. Malware running as you, with your vault unlocked, can read what you can read. No application-level encryption fixes that.
- A weak passphrase. Argon2id makes guessing expensive, not impossible. A short or reused passphrase is the weakest part of this design.
- A forgotten passphrase. There is no recovery. That is a security property, and it is also a real risk to you.
- Anything you export. A CSV export is plaintext by design, so it round-trips. Once it leaves the vault it has no protection but the disk it sits on.
Independent review
DohFlow has not had a third-party security audit. The code is open, the cryptographic choices are conventional and documented, and the reasoning is in the repository’s ADRs — but nobody independent has been paid to attack it. We would rather you know that than assume otherwise.
Supported versions
Pre-1.0, only the latest released version receives security fixes — there are no long-term support branches and no backports. Running an old build means running known bugs; the honest advice is to stay current. This tightens once DohFlow reaches 1.0.
How releases roll forward
Releases are immutable once published — a bad release is never deleted or unpublished, because every installed copy’s update check resolves to “the latest release” and pulling one out from under that would break the next check for anyone still on it. Instead, a bad release is superseded by a higher patch version; past releases stay visible in the changelog rather than disappearing.
Export control
DohFlow is publicly available encryption software using only standard, published cryptography, so it is not subject to the EAR under 15 CFR 742.15(b)(1). The full analysis is in the repository at docs/security/export-control.md.