Security at Earnist

Your money.
Not ours to move.

Earnist connects to your bank read-only. We can see transactions. We cannot touch a dollar. Here is exactly how it works — plain English, no marketing.

Read-only bank connections

When you link a bank or card through Plaid, Earnist gets read access to transactions only. There is no code path — none — through which Earnist can move money, initiate transfers, or change your bank settings. You can revoke the connection any time from Settings, which calls Plaid's item/remove endpoint and deletes the stored token immediately.

Bank credentials never touch Earnist

The username and password for your bank are entered inside Plaid's own secure window — Earnist never sees them, never receives them, never stores them. What comes back to Earnist is a Plaid-issued access token, which we then encrypt at rest before storing.

Encryption you can point at

TLS 1.2+ enforced for all external traffic. Passwords bcrypt-hashed with per-password salt. Plaid access tokens encrypted at the application layer with Fernet (AES-128 CBC + HMAC-SHA256) using a runtime-injected key. All third-party API calls (Plaid, Stripe, Anthropic) run over HTTPS.

Signed webhooks

Plaid transaction webhooks are verified with the Plaid-Verification ES256 JWT (JWK fetched and cached from Plaid, freshness enforced at 5 minutes, request body compared with constant-time SHA-256). Production rejects unsigned webhooks; sandbox passes them with observability logging. Stripe webhooks are signature-verified the same way.

You can leave, and take your data with you

Export everything as JSON from Settings → Data → Download all my data. Delete your account from the same page: we revoke every linked Plaid Item upstream, purge 12 collections of your data, and write a hashed-email audit row to comply with data-protection recordkeeping. Everything else is gone within 24 hours; encrypted backups age out on a 30-day rolling window.

Per-user scoping enforced at the query layer

Every authenticated database query is scoped by the requesting user's ID. It is not possible for one user to read or write another user's records — the enforcement is at the query, not just the UI. Administrative endpoints require both an authenticated session AND an email in an allow-list.

Where we're honest

Not everything is finished.

The things below are documented gaps or design decisions. We publish them because trust is built on precision, not on marketing language. If any of these is a dealbreaker for you, please don't sign up — but do let us know so we can prioritize.

Application-level MFA
Before Earnist connects any bank account, we email a 6-digit one-time code that must be entered in the app. The verification is scoped to the current session for 15 minutes so back-to-back bank links don't re-prompt. Users signing in with Google also inherit Google's MFA. Full TOTP-authenticator support (Authy, 1Password) is on the roadmap for users who want a second factor on login itself.
Shipped
Rate limiting on auth endpoints
We do not yet rate-limit /api/auth/* endpoints. We monitor auth logs manually today; automatic rate limiting is on the near-term roadmap.
Roadmap
Field-level PII encryption
Transaction fields (merchant, amount, category) are not encrypted at the application layer beyond volume encryption. We rely on the underlying storage layer's encryption for these fields, on the basis that Plaid transaction metadata is not classified as sensitive PII on its own.
Design decision
SOC 2
SOC 2 Type I is on the roadmap once revenue supports the audit cost. Until then we operate transparently with public documentation like this page.
Post-revenue
Data retention

We keep what you need. Nothing more.

Active account
Kept for the life of your account. IRS retention rules for taxpayers require 3–7 years of records — that's the point of the product.
Deleted account
Personal data purged within 24 hours of your delete request. A hashed audit row is kept 7 years for compliance evidence.
Bank connections
Access token revoked upstream via Plaid item/remove and deleted locally on disconnect or account deletion. Confirmed business transactions stay for audit trail; unconfirmed pending are purged.
Support tickets
2 years, then automatically purged.
Backups
30-day rolling window.
Report a vulnerability

Found something? Please tell us.

If you've found a security issue in Earnist, we'd rather hear about it directly than read about it later. Email us at the address below with as much detail as you can share — we respond to every credible report within one business day, and we won't take legal action against good-faith researchers who follow reasonable disclosure norms.

security@earnist.app
E
Install Earnist
One tap install — opens fullscreen like a native app.