Stave Privacy Policy

Version 2.0 · Last updated: July 2026


In one paragraph

Stave is a Mac app that reads your bank SMS and email statements locally on your machine and helps you understand where your money goes. Stave never asks for your bank passwords and doesn’t share your data with anyone. Categorisation is on-device by default. A few things do talk to servers we run: Pro subscribers’ Macs check in with our license server roughly weekly (license key and an anonymous device identifier only — see Section 6), and if you explicitly opt in to cloud-assisted categorisation (direct download only, off by default), merchant names go to our own categorisation server, which may forward them to OpenAI on a cache miss (see Section 3.7). On the direct download, if you opt in, Stave can also send anonymous crash reports and feature usage events through Apple’s CloudKit so we can fix bugs and decide what to build next — both off by default. The Mac App Store edition has no diagnostics and no cloud categorisation at all. Read on for specifics, or jump to Section 7 to verify these claims yourself.


Editions

Stave ships in two editions from the same source code. Both are local-first, never see your transactions, and use only your own private iCloud for optional sync. They differ in distribution:


1. Our position on privacy

Stave is local-first. Your money is your business, and ours is only to help you see it clearly.

The architecture follows one principle: your data never leaves your sight without your explicit decision. Stave never asks for your bank credentials, never holds your account information, and never has access to your transactions.

Categorisation is on-device by default for every user, always — no cloud AI service sees a transaction unless you take a separate, explicit action. The one opt-in exception is described in full in Section 3.7: direct-download users can choose to send merchant name strings (never amounts, accounts, dates, or message text) to our own categorisation server, which may in turn ask OpenAI. There is no Anthropic integration, no Google Cloud integration, and no other third-party model API anywhere in Stave.


2. Core principles


3. How Stave works

3.1 Data sources

Stave reads two types of data, both stored locally on your Mac by Apple’s own apps:

You explicitly grant access to each source during setup. Stave reads transaction information directly from these local files on your machine.

3.2 On-device categorisation

Stave categorises transactions through a three-tier pipeline that runs entirely on your Mac:

  1. Your own rules. When you categorise a transaction, Stave learns the pattern and applies it to similar transactions in the future.
  2. Static rules. A built-in dictionary of common Indian merchants (Swiggy, Uber, BESCOM, etc.) provides starting categorisation without any model inference.
  3. Apple Intelligence. For transactions that don’t match the first two tiers, Stave uses Apple’s on-device Foundation Models (macOS 15.1+) to suggest a category. The model runs on your Mac’s Apple Silicon. No prompts, transactions, or results are sent to Apple’s servers.

For SMS transaction extraction (parsing the merchant, amount, and account from a raw SMS string), Stave uses Apple’s CoreML Named Entity Recognition framework, also running on-device.

Two additional post-processing detectors run locally to improve accuracy: a self-transfer pairing detector and a credit-card payment validator. Both are deterministic logic, not models.

3.3 How Stave handles edge cases

When the on-device pipeline cannot fully resolve a transaction or statement, Stave surfaces it for manual review rather than guessing:

These manual paths add slight friction but mean Stave never sends your data to a cloud service to make these decisions for you.

3.4 Anonymous diagnostics (opt-in, direct download only)

This section applies only to the direct download from getstave.app. The Mac App Store edition has no diagnostics — it never writes to CloudKit public, regardless of any setting.

On the direct download, if you opt in, Stave sends two kinds of anonymous data to a public CloudKit database that Avysion controls. Both are off by default. A user who never enables diagnostics sends zero events.

During setup, Stave asks once: “Help improve Stave by sharing anonymous diagnostics?” — a single combined toggle, off by default. After setup, Settings → Privacy splits this into two separate toggles you can control independently:

Toggle 1 — Crash reports

Toggle 2 — Feature usage events

Both kinds of data include a stable per-install identifier so we can group events from the same Stave installation (helping us measure crash impact, retention, and feature adoption). The identifier is generated locally on your Mac. It is not linked to your Apple ID, your name, or any contact information you’ve shared with Apple.

You can disable either toggle at any time in Settings → Privacy. When disabled, we delete events tied to your install ID from the CloudKit public database within 30 days.

3.5 iCloud synchronisation (optional)

If you choose to use Stave on multiple devices (your Mac and your iPhone), data syncs through Apple CloudKit:

Note: the diagnostics in Section 3.4 use CloudKit’s public database, which is separate from your private database. Disabling iCloud sync (private database) doesn’t disable diagnostics, and disabling diagnostics doesn’t disable iCloud sync. They’re independent toggles.

3.6 Diagnostic logs (support, user-initiated)

Stave keeps a small rotating technical log on your Mac (under ~/Library/Logs/Stave, inside the app’s sandbox container on the Mac App Store edition). It records structural events only — pipeline stages, counts, durations, error codes, and public bank identifiers. By design it does not contain transaction amounts, merchant names, SMS or email content, account numbers, or anything you authored, and a redaction pass strips currency amounts and long digit runs as a second line of defence.

When you contact support from within Stave, you can choose to attach this log. Stave hands the file to your own mail client — you review it and send it to stave@avysion.studio, and a “Don’t attach” option lets you send without it. Stave never transmits this log automatically and never sends it anywhere on its own. This applies to both editions; because it is sent only by you, through your mail client, it is not part of any automatic data collection.

3.7 Optional cloud-assisted categorisation (opt-in, direct download only)

By default, categorisation is entirely on-device (Section 3.2) — nothing about a transaction ever leaves your Mac. In the setup wizard or Settings, direct-download users can additionally choose to turn on cloud-assisted categorisation for merchants the on-device tiers can’t confidently place. This is off by default and reversible at any time. The Mac App Store edition does not include this feature at all — the code path doesn’t exist in that build, so there is nothing to enable.

When you opt in:

Turning this off in Settings stops future merchant names from being sent. It does not retroactively delete anything already cached — which, again, is only merchant names and categories, never transaction data.

3.8 Contributing a sample SMS (getstave.app website, optional)

Separately from the Stave app, the getstave.app website has an optional, public “Contribute” page where anyone can paste a bank SMS to help us extend Stave’s on-device parser to more banks. This is a website feature, not something the Stave app does on your Mac. If you use it, we collect the message text you paste, the bank you attribute it to, an optional email address, and (like any web form) your IP address, browser user-agent, and the referring page. Submissions are used to build and test the on-device parser dictionary and are retained indefinitely — this feature has no automatic deletion schedule today.


4. What data is handled

Data typePurposeStorage location
Transaction SMSReading transactionsOn-device only
Bank statement PDFsReading transactionsOn-device only (read from Apple Mail)
Bank names and account last-4 digitsCategorising accountsOn device, optionally syncs via your private CloudKit
Categories, tags, and notes you createPersonalisation and recallOn device, optionally syncs via your private CloudKit
Crash reports with a per-install identifier (optional, opt-in — direct download only)Identifying and fixing bugsCloudKit public database controlled by Avysion
Anonymous feature usage events with a per-install identifier (optional, opt-in — direct download only)Understanding feature adoptionCloudKit public database controlled by Avysion
License key + anonymous device identifier (Pro subscribers only)Verifying subscription statusSent to Stave’s license server roughly weekly; no financial data included
Merchant name string (opt-in cloud categorisation, direct download only)Suggesting a category via Stave’s categorisation server, forwarded to OpenAI only on a cache missSent to Stave’s server; anonymous cache, retained up to 180 days
SMS text you submit via the Contribute page (optional, public web form on getstave.app)Improving the on-device parser’s bank-format dictionaryStored on Stave’s server indefinitely, with your optional email and standard web request metadata (IP, user-agent, referring page)
Banking passwordsStave never requests theseN/A
On-device diagnostic logTroubleshooting support requestsOn device; sent only if you attach it to a support email you send
PDF attachment passwordsHeld only in your Mac’s Keychain when you provide onemacOS Keychain (not synced by Stave)
Contacts, photos, locationStave never accesses theseN/A

5. The pseudonymity question

This section applies only to the direct download — the Mac App Store edition sends no diagnostics. On the direct download, the diagnostics events in Section 3.4 use a stable per-install identifier rather than fully anonymous events. This is a deliberate trade-off:

If pseudonymous events still feel too revealing for you, leave diagnostics off. The app works exactly the same with diagnostics off as with it on.


6. Network usage

Stave is designed to operate primarily offline. Network traffic falls into these categories:

Always allowed (when the relevant feature is in use):

Opt-in only (off by default):

Avysion operates two servers your Stave installation may talk to, both at getstave.app: a license server (Pro subscribers only, described above) and, if you’ve opted in, a categorisation server (Section 3.7). Neither ever receives your transaction amounts, dates, accounts, or message content. Outside of these, the only other Avysion-controlled destination is Apple’s CloudKit public database, and only if you’ve opted in to diagnostics. Stave’s own code never talks to OpenAI, Anthropic, or any other cloud AI service directly — only our categorisation server does, and only for merchant names, and only when you’ve opted in.


7. Verification: don’t trust us, verify

You can confirm Stave’s network behaviour using built-in macOS tools:

  1. App Privacy Report. Go to System Settings → Privacy & Security → App Privacy Report. Stave’s network connections appear there. On the Mac App Store edition you’ll see only Apple domains and, for Pro subscribers, getstave.app (subscription verification). On the direct download with diagnostics and cloud categorisation both off, you’ll see only Apple domains and getstave.app (update checks, and license verification if you’re Pro). Turn on cloud categorisation and getstave.app is still the only non-Apple domain you’ll see — the OpenAI call happens on our server, not your Mac.
  2. Activity Monitor. Open Activity Monitor, select the Network tab, and search for Stave. Sent bytes stay near zero except during iCloud sync, update checks, license verification, or opt-in diagnostics or categorisation requests — and even with categorisation on, every connection your Mac makes still resolves to Apple or getstave.app; it never dials api.openai.com itself.
  3. Sandboxing & signing. The Mac App Store edition runs in the macOS App Sandbox — macOS prevents it from accessing files, folders, or system resources unless you’ve explicitly granted permission. The direct download is notarized and hardened-runtime, and reads your Messages and Mail only through folders you grant via the system file picker.
  4. Source code inspection. We’re happy to walk through the code with anyone who asks.

8. Your data, your control

You’re never locked into Stave:

Data export to CSV/JSON is on the roadmap but not yet shipped. When it lands, it will be a one-click action.


9. Changes to this policy

If we update this policy, the change is recorded in the version history at the top of this document. Material changes (new data types handled, new third-party services that fire by default, changes to sync or diagnostics behaviour) will be communicated in-app at the next launch following the change.


Contact

Questions about how Stave handles your data, or about the architecture described above:

Email: stave@avysion.studio
Website: https://www.getstave.app/


Stave is built by Avysion in India. The Stave team has zero access to your transactions, balances, or messages. That’s not a policy choice — it’s an architectural constraint. The Mac App Store edition is sandboxed by macOS and the direct download is notarized and hardened-runtime; the network is observable in Activity Monitor, and every external service is opt-in. We invite scrutiny.

← Back to getstave.app