← Back

Honest & local-first.

Your financial data is processed on your device and stays there unless you choose to sync. When you enable sync, the app encrypts your data on your device before sending it to the server, so the server never sees a readable copy. The full source code is public on GitHub, so anyone can verify exactly what it does. I built it for people in the US, Canada, UK, Australia, New Zealand, Singapore, and beyond. Here's how it works.

Last updated October 23, 2026

What leaves your device?
Opening the app
Data sentInternet address, browser type
sent automatically whenever your browser requests a page β€” true of any site, not just this one
Where it goesCloudflare's servers
Blockable?No
Opening the import screen
Data sentInternet address, browser type
sent when your browser downloads community-rules.json
Where it goesCloudflare's servers
Blockable?Yes
CSV import still works β€” auto-categorization just has fewer built-in matches, so more transactions land in "Other."
Importing a CSV
Data sentNothing
Where it goesStays on your device
Blockable?Nothing to block
Signing in with Google
Data sentYour Google account email
+ financial data after sign-in (encrypted)
Where it goesGoogle (identity only), then Cloudflare's servers (encrypted data)
Blockable?Don't sign in
Signing in with email link
Data sentEmail address
+ financial data after sign-in (encrypted)
Where it goesResend (email delivery), then Cloudflare's servers (encrypted data)
Blockable?Don't sign in
Adding a vehicle by VIN
Data sentYour vehicle identification number (VIN)
only if you use the optional VIN lookup when adding a vehicle
Where it goesA US government vehicle database
NHTSA β€” used to auto-fill year, make, and model from your VIN
Blockable?Skip VIN lookup
type it in yourself
Analytics
Data sentPage views, referring domain, browser type, OS, country
also fires on 3 in-app actions: demo explored, first CSV import, returning use β€” no financial data
Where it goesUmami (no cookies or personal data)
Blockable?Yes
No effect on the app either way β€” only removes usage stats.
Yes = any privacy extension blocks it. No = infrastructure-level, outside your control.

Your data flow

πŸ“„
YOUR BANK OR CREDIT CARD CSV FILE
you import
πŸ’» πŸ“±
YOUR DATA STAYS IN YOUR BROWSER ON YOUR DEVICE
nothing uploaded unless you sync Β· no account required
⬇
Cloudflare also sends categorization rules to your browser
once per session Β· no financial data leaves your device
without sign-in
Your device only
with sign-in
πŸ”΅ Cloudflare's servers
encrypted data leaves your device
opt-in only
πŸ’Ύ Your data saves automatically

The app saves everything β€” accounts, balances, imported transactions, budgets, and snapshots β€” to your browser's local storage. It persists across refreshes and restarts, even without signing in. But this is also the only copy of your data unless you back it up: get a new phone or computer, clear your browser's data, or switch browsers, and it's gone for good β€” there's no way for me to recover it, since I never had it in the first place. Your browser processes CSV files locally and nothing leaves your device unless you choose to sync. You can export your transactions and budget history as a CSV anytime from the Spending and Budget tabs, or export a full JSON backup β€” every tab's data in one file: transactions, accounts, net worth snapshots, budgets, categories, and settings β€” from the βš™ menu in the nav bar (Export data backup) β€” and import it back on any device to restore everything.

πŸ” Sign in to sync across devices

Sign in with Google or a passwordless email link and the app backs up your full data β€” accounts, transactions, budgets, categories, and snapshots β€” directly to your account on Cloudflare's infrastructure. You'll also set a sync passphrase (separate from your sign-in) and the app uses it to encrypt your data on your device before it leaves. The server stores your financial data in encrypted form it cannot read, and neither can I. (Some metadata is readable: when snapshots were saved and your account email.) The Worker validates your session token before granting database access, restricting each account to its own data only. Choose that passphrase carefully: there's no reset. Sign in on any device and enter it to restore everything. Sync doesn't merge changes from multiple devices β€” if you edit on two devices before either syncs, whichever device saves to the cloud first wins. The other device keeps its edits saved locally and shows a warning that they haven't synced, rather than silently overwriting the newer version β€” reload there to pick up the latest. If you'd rather your data never leave your device, skip sign-in β€” the app works fully without it.

πŸ—‚ Community categorization rules

Once per session when you open the import screen, the app downloads community-rules.json from Cloudflare. This file contains keyword→category mappings the app uses to auto-categorize your transactions. The app sends no transaction data, descriptions, or personal information — it only downloads the rules file. The file lives publicly on GitHub so anyone can audit it. Missing a merchant? Suggest a merchant category ↗ — no account required. You can block this download using any privacy extension — the app will still work, but will skip applying community categorization rules to your transactions. Your own custom rules still apply.

Two separate types of data collection happen when you use this app β€” they're easy to confuse:

  • Server logs β€” automatic, can't be turned off, standard for any website (see "Cloudflare hosting logs" below).
  • Analytics β€” optional, privacy-respecting, blockable (see "Analytics β€” what's collected" below).
πŸ–₯ Cloudflare hosting logs

When you visit this app, Cloudflare records standard server request data: your internet address, browser type, pages requested, and timestamps (this is standard for any website you visit). Cloudflare manages this logging under their own privacy policy β€” I have no control over it and no direct access to individual request logs. It contains no financial data; Cloudflare applies the same logging to every website on their network. See cloudflare.com/privacypolicy for details.

πŸ“Š Analytics β€” what's collected

This site uses Umami, a privacy-respecting analytics tool. It runs on the landing page, this privacy page, and the bank export guides. It also records a single event when you open the app directly (from a bookmark, home screen icon, or typed URL) β€” not every time you use it, just when it first loads. It also records three specific actions inside the app: when you explore the demo, when you import your first real CSV, and once if you come back and import again more than 20 days later. It records page views, the site that linked you here (if any), browser type, operating system, and country (inferred from your IP address β€” your internet protocol address β€” which it never stores). No financial data is ever sent. Umami sets no cookies, collects no personal data, and never identifies or tracks individual visitors between visits. You can block it with any privacy extension β€” the site works fine without it.

Frequently asked questions

Why no bank login?+

By design. Most finance apps use third-party services to pull your transactions directly β€” which means your bank credentials end up on someone else's server, with ongoing access to your account. A CSV export is a file your bank already gives you. Same data, no credentials handed over, no third-party aggregation service in the middle, no ongoing access. You choose what to import and when.

Can the developer see my financial data?+

No β€” and this isn't just a policy. It's how I built the app. By default, the app saves your data to your browser on your device. I built no mechanism to transmit it anywhere and run no server to receive it. If you choose to sign in, the app encrypts your data on your device before syncing to Cloudflare's servers, and neither Cloudflare nor I can read it. Either way, I have no way to see your financial data.

Could a hacker access my financial data?+

Not through my servers β€” and that's structural, not just policy. Because your financial data stays on your device unless you enable sync, I don't maintain a server-side copy in readable form. When sync is enabled, your data is encrypted on your device before upload using a passphrase only you know β€” that passphrase is never sent to the server or stored anywhere I can access. This significantly limits what someone accessing the database could learn, but no software can eliminate every security risk β€” your device and browser security while signed in, your sync passphrase strength, and the integrity of the app code all matter too. Here are the three things someone could theoretically attack, and how each is protected:

  • The app files β€” Cloudflare hosts these. Deploying any change requires my Cloudflare account credentials plus my physical machine, and that account uses two-factor authentication. An attacker would need both to make any change.
  • The source code β€” I keep it on GitHub; that account also uses two-factor authentication. Because the source is public, anyone can verify exactly what the app does and spot anything unexpected.
  • Your synced data β€” only relevant if you've signed in. The app encrypts your data on your device before sending it to Cloudflare's Workers infrastructure β€” even if someone accessed the database, they'd find only encrypted data they can't read. Each API request requires a valid session token, restricting database access to your own account.

None of these paths expose your readable financial data to me or anyone with access to my infrastructure. The remaining risk surface is your own device and browser security while signed in, and the strength of your sync passphrase β€” things outside this app's control.

What if this app shuts down?+

Two scenarios:

  • The website stops working β€” you'd see a 'page not found' message when you try to open it, but your data is unaffected. Without signing in, it lives on your device. With sign-in, the app encrypts it on your device and stores it on Cloudflare's infrastructure, tied to your email address.
  • I stop maintaining it β€” the app keeps working exactly as-is. No data loss, no changes.

In either case, export your transactions from the Spending tab, budget history from the Budget tab, or a full JSON backup (everything in one file) from the βš™ menu in the nav bar β€” anytime. Your data outlives the app.

Is my CSV safe after I import it?+

Yes β€” and not just because I say so. Your browser processes the CSV entirely on your device and uploads nothing. The app reads the file, parses the transactions locally, and discards the rest β€” I never receive the file or its contents. If you've signed in, the app encrypts the parsed transaction records on your device and syncs them to Cloudflare's servers, but your original CSV file never leaves your computer.

Is my synced data encrypted?+

Yes. When you sign in, the app encrypts all your data β€” transactions, budgets, accounts, snapshots β€” on your device using AES-256-GCM before sending it to Cloudflare's servers. The server stores only encrypted data it cannot read. The app derives the encryption key from a passphrase you set (not your sign-in email) and that passphrase never leaves your browser, so the server never has what it would need to decrypt your data. There's no way to reset it: if you forget your sync passphrase, you can't recover your synced data β€” your local data on this device is unaffected either way. If you don't sign in, you don't need encryption β€” your data never leaves your device in the first place.

Could the developer share my data with governments or law enforcement?+

Not in readable form β€” and that's architectural, not a policy choice. If you haven't signed in, the app stores your data only on your device and I receive none of it β€” nothing to hand over. If you have signed in, the app encrypts your data on your device before sending it to Cloudflare's servers, so even a legal request would produce only encrypted data that neither Cloudflare nor I can read. Either way, there's nothing usable for me to hand over.

Does this app use cookies?+

Only one, set during Google sign-in: a 5-minute security cookie that prevents a forged sign-in from attaching someone else's account to your browser. It expires on its own and is never used for tracking. Sign-in also stores a session token in localStorage (not a cookie). Umami sets none. You can block analytics with any privacy extension.

What if my device has spyware on it?+

Spyware is malicious software that secretly records what happens on your device β€” it could capture anything visible on your screen or stored locally, including data this app saves to your device. This risk applies to all software that runs locally, not just this app. I can only control what's in the app's code β€” your device is yours to protect. Keeping your operating system and browser updated is the single most effective step you can take.

Does the app work without an internet connection?+

Yes β€” on your first visit the app installs a service worker that caches everything it needs (the app itself, fonts, and libraries). After that, it works fully offline even after closing the tab or restarting your browser β€” no connection required. You can view your data, add transactions, and use every feature offline. The only things that need a connection are: the very first load (to install the cache), downloading the community rules file when you open the import screen (optional β€” the app works without it), and syncing if you're signed in.

Where is my synced data stored, and why Cloudflare?+

Sign-in and sync run on Cloudflare Workers with a D1 database, which is the same infrastructure that already serves the app's files. Because the app encrypts your data on your device before sending it, none of your financial data leaves your device in readable form, and no third-party JavaScript needs to load from an outside CDN. The app encrypts your synced data on your device before sending it to Cloudflare's infrastructure, so Cloudflare stores only encrypted data it cannot read. Sign-in is either Google or a passwordless email link β€” no password to store or steal. If that's still a concern, skip sign-in β€” the app works fully without it, and the source code is public so anyone can verify exactly what it does.

Can I self-host this?+

Yes. The full source code is on GitHub β€” it's a single HTML file with no build step or server required. Download it and open it directly in your browser, or host it on any static file host. Used locally (no sign-in), your data stays wherever you run it, fully independent of trakyodollas.com. One caveat: the optional sign-in/sync feature calls this project's own Cloudflare Worker API β€” a self-hosted copy that syncs still sends its encrypted data there, not to a Worker you control. Skip sign-in on a self-hosted copy and it behaves exactly like the hosted version, entirely local.

What third-party code runs in the app?+

The app uses two open-source charting libraries β€” Chart.js for the main spending bar charts (including Trend), and D3.js for the Split, Flow, and Net Worth views. Chart.js, D3, and the Flow chart's d3-sankey plugin are all self-hosted from this app's own /lib/ folder. No code loads from any outside CDN. None of this sends any financial data β€” these files contain only JavaScript. Your financial data stays intact on your device.

Can other websites read my data?+

No β€” and this isn't just a policy, it's how browsers work. Each website gets its own private storage, and your browser strictly enforces those boundaries. No other site can reach what this app stores β€” not by policy, but by technical design.

Your rights

These rights apply to users in the EU (GDPR β€” General Data Protection Regulation), UK (UK GDPR), and similar frameworks elsewhere. I honor them for everyone regardless of location. Because this app holds no financial data on its own servers, its design already satisfies most of these rights β€” but here's the full picture:

Access Request a copy of any personal data I hold about you. For most users the answer is: none β€” financial data stays on your device. If you've synced, Cloudflare's database holds only an encrypted copy that neither Cloudflare nor I can read β€” the readable copy already lives on your device (see Portability below to export it).
Erasure Request deletion of personal data. Clear all data in the app (βš™ menu) wipes local storage on that device only β€” other devices keep their own local copies. If you've synced, use "Delete synced data" (under "Forgot your passphrase?" in the sync settings) to remove the encrypted rows from Cloudflare's database. Or email contact@trakyodollas.com and I'll remove your synced data and account record (email address and sign-in history).
Portability Export your data anytime. Use the CSV export buttons in the Spending and Budget tabs, or export a full JSON backup from the βš™ menu in the nav bar β€” no request needed, no waiting.
Rectification Correct inaccurate data. Your data lives on your device β€” edit transactions directly in the app. No request needed.
Objection Object to processing based on legitimate interest. This covers two things: Cloudflare's server logs (IP address, browser type β€” Cloudflare manages these, limit them via VPN or Tor) and Umami analytics (page views, referring domain, browser type, OS, and country β€” block it with any privacy extension).
Restriction Ask for processing to stop while a dispute is resolved. Email contact@trakyodollas.com and I'll respond promptly.
Legal basis for each type of data processing
Cloudflare hosting logs Legitimate interest β€” logging IP address and browser type is technically necessary to deliver the website. Standard for any web host.
Umami analytics Legitimate interest β€” aggregate, anonymous traffic data to understand how the site is used. No cookies set, no personal identifiers stored. Block it with any privacy extension.
Account sync Performance of a user-initiated service β€” sync is entirely your choice. Signing out clears the sync passphrase and session token from your device but leaves your encrypted backup intact on Cloudflare's servers β€” sign back in and re-enter your passphrase to restore access. The app works fully without sync.
Questions or concerns?

If you have questions about this privacy policy or how I handle your data, there are two ways to reach me:

βœ‰ contact@trakyodollas.com β€” for privacy questions or anything you'd rather not post publicly
βŽ” GitHub Issues β€” for bugs, feature requests, or public discussion

I build and maintain this app by myself. I read everything. It's free, with no data selling β€” if it's useful to you, you can support its development.