← Back

Honest & local-first.

No server ever reads your financial data β€” it stays on your device, and your browser turns your CSV files into spending data locally. The full source code is public on GitHub, so anyone can verify exactly what it does. Built for people in the US, Canada, UK, Australia, New Zealand, Singapore, and beyond. Here's how it works.

Last updated July 26, 2026

What leaves your device?
Event
Data sent
Where it goes
Blockable?
Opening the app
Internet address, browser type
sent automatically whenever your browser requests a page β€” true of any site, not just this one
Cloudflare's servers
No
Loading extra code
Internet address, browser type
sent to two outside services this app relies on
Two code-hosting companies
cdnjs (powers the charts) and jsDelivr (powers sign-in) β€” not this app's own servers
Yes
Importing a CSV
Nothing
Stays on your device
Nothing to block
Opening the import screen
Internet address, browser type
sent when your browser downloads community-rules.json
Cloudflare's servers
Yes
Signing in with Google
Financial data (encrypted)
Supabase's servers (encrypted)
Don't sign in
Signing in with email link
Email address
+ financial data after sign-in (encrypted)
Supabase (to send the link), then Supabase's servers (encrypted)
Don't sign in
Analytics
Page views, country
no financial data
Umami (no cookies or personal data)
Yes
Adding a vehicle by VIN
The VIN you enter
only if you use the optional VIN lookup when adding a vehicle
A US government vehicle database
NHTSA β€” used to auto-fill year, make, and model from your VIN
Skip VIN lookup
type it in yourself
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
Loading extra code
Data sentInternet address, browser type
sent to two outside services this app relies on
Where it goesTwo code-hosting companies
cdnjs (powers the charts) and jsDelivr (powers sign-in) β€” not this app's own servers
Blockable?Yes
Importing a CSV
Data sentNothing
Where it goesStays on your device
Blockable?Nothing to block
Opening the import screen
Data sentInternet address, browser type
sent when your browser downloads community-rules.json
Where it goesCloudflare's servers
Blockable?Yes
Signing in with Google
Data sentFinancial data (encrypted)
Where it goesSupabase's servers (encrypted)
Blockable?Don't sign in
Signing in with email link
Data sentEmail address
+ financial data after sign-in (encrypted)
Where it goesSupabase (to send the link), then Supabase's servers (encrypted)
Blockable?Don't sign in
Analytics
Data sentPage views, country
no financial data
Where it goesUmami (no cookies or personal data)
Blockable?Yes
Adding a vehicle by VIN
Data sentThe VIN you enter
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
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
πŸ”΅ Supabase'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. 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 (accounts, budgets, categories, and all transactions) from the overflow menu (β‹―) on the Spending tab β€” 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 via Supabase (open source). You'll also set a sync passphrase β€” separate from your Google or email sign-in β€” and the app uses it to encrypt your data on your device before it leaves. Supabase stores only encrypted data it cannot read β€” and neither can I. Row-level security policies add a second layer, restricting database access to your own signed-in account. 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, the app keeps whichever save happened last. 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 pattern ↗ — 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 records page views, referrer, browser type, operating system, and country (inferred from your IP address, which Umami never stores). Umami sets no cookies, collects no personal data, and never identifies or tracks individual visitors across sessions. You can block it with any privacy extension β€” the app 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 gets imported and when.

Can the developer see my financial data?+

No β€” and this isn't just a policy. It's how the app is built. 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 Supabase's servers β€” even Supabase can't read it, and neither can I. Either way, I have no way to see your financial data.

Could a hacker access my financial data?+

No β€” and this isn't just a policy, it's structural. Neither the app nor I hold your financial data, so there's nothing to steal. That said, here are the three things someone could theoretically attack, and how each is protected:

  • The app files β€” hosted on Cloudflare. 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 β€” stored on GitHub, also protected with 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 Supabase β€” even if someone accessed the database, they'd find only encrypted data they can't read. Row-level security policies add a second layer, restricting access to your sign-in credentials only.

None of these paths expose your financial data.

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 Supabase's servers β€” tied to your sign-in credentials, not to this app.
  • 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 overflow menu (β‹―) on the Spending tab β€” 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 parsed transaction records are encrypted on your device and synced to Supabase'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 Supabase's servers. Supabase stores only encrypted data it cannot read. The app derives the encryption key from a passphrase you set β€” not your sign-in credentials β€” and that passphrase never leaves your browser, so Supabase 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, encryption isn't needed β€” your data never leaves your device in the first place.

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

No β€” and this is technical, not just policy. 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 Supabase's servers β€” even a legal request to Supabase would produce only encrypted data that neither they nor I can read. Either way, there's nothing usable for me to hand over.

Does this app use cookies?+

No β€” Umami sets no cookies and uses no persistent identifiers. Supabase and Google's sign-in infrastructure may set cookies if you choose to sign in for the optional sync feature. You can block analytics entirely 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 β€” after the initial page load, the app runs entirely in your browser with no connection required. You can view your data, add transactions, and use every feature offline. The only things that need a connection are: loading the app for the first time, downloading the community rules file when you open the import screen (optional β€” the app works without it), and syncing if you're signed in.

What is Supabase and why use it if you care about privacy?+

Supabase is an open-source backend platform β€” not an ad company. I use it here for one thing only β€” optional sign-in and data sync (authentication and database). Cloudflare serves the app's files, not Supabase. I chose Supabase because it's open source, privacy-focused, and handles the hard parts of secure sign-in without tying your data to Google. The app encrypts your synced data on your device before sending it to Supabase's infrastructure (AWS servers in the US) β€” Supabase stores only encrypted data it cannot read. 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. Your data stays wherever you run it.

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 β€” plus the Supabase client for sign-in and sync. Like most web apps, it loads these from public CDNs (content delivery networks that serve open-source software): Chart.js and D3's core both from cdnjs, and a small D3 plugin (d3-sankey, used only for the Flow view) plus the Supabase client from jsDelivr. Your browser fetches these when the app loads. None of these CDNs receive any financial data β€” they only deliver JavaScript files. Blocking cdnjs breaks every chart. Blocking jsDelivr breaks only the Flow view and disables sign-in/sync, since those are the only two things it delivers. Either way, your financial data remains completely safe and 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 personal data held about you. For most users the answer is: none β€” financial data stays on your device. If you've synced, Supabase holds only an encrypted copy that neither Supabase 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 β€” if you've synced, use "Delete synced data" (under "Forgot your passphrase?" in the sync settings) to remove the encrypted copy from Supabase's servers too. Or email contact@trakyodollas.com and I'll delete it from the database.
Portability Export your data anytime. Use the CSV export buttons in the Spending and Budget tabs, or export a full JSON backup from the overflow menu (β‹―) on the Spending tab β€” 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. The only processing in this category is Cloudflare's server logs (IP address, browser type). These are managed by Cloudflare β€” you can limit them by using a VPN or Tor, or contact Cloudflare directly.
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 Umami collects no personal data β€” GDPR doesn't apply to this processing. No cookies set, no identifiers stored. Block it with any privacy extension.
Account sync Performance of a user-initiated service β€” sync is entirely your choice, and signing out revokes it. The app works fully without it.
Questions or concerns?

If you have questions about this privacy policy or how your data is handled, 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

This app is built and maintained by one person. I read everything. It's free, with no data selling β€” if it's useful to you, you can support its development.