Skip to main content
Zero-knowledge architecture

We Can't Read Your Data. By Design.

Your vault is encrypted on your device before it reaches our servers. Here is exactly how our architecture works, and how you can verify it yourself.

Click badges to verify.

TL;DR

Traditional Budget Apps

  • Can read your data: They hold the encryption keys
  • Server-side encryption: Data decrypted on their servers
  • If breached: Your transactions are exposed
  • Employee access: Staff can view your spending

Sunny Budget

  • Cannot read your data: Only you have the keys
  • Client-side encryption: Encrypted in your browser
  • If breached: Only encrypted gibberish is exposed
  • Zero access: No one can view your data without your password

How Most Budget Apps Work

Traditional budgeting apps typically store transaction details in structured database columns that their servers can read and process.

Typical Database Structure
SELECT amount, merchant_name, category, date
FROM transactions
WHERE user_id = '123'

Their servers can decrypt and read: "Starbucks", "$4.50", "Coffee", "Jan 15, 2026"

This approach enables convenience but means the company (and anyone who breaches their servers) can read your complete financial history. They encrypt data at rest, but they hold the keys.

How Sunny Budget Works Differently

We store your entire financial workspace as an encrypted blob that only you can decrypt. Your password never leaves your browser. All encryption happens on your device before anything syncs to our servers.

Our Actual Database Schema
model Vault {
  id         String   @id @default(cuid())
  ownerId    String   // Who owns it (not what's inside)
  
  // All your financial data, encrypted
  ciphertext Bytes    // ← Everything you care about is here
  iv         Bytes    // Initialization vector
  version    Int      // Schema version
  
  updatedAt  DateTime
  createdAt  DateTime
}

Notice what's missing? There are no columns for amount, merchant, category, or account. That is all encrypted inside the ciphertext blob.

Encrypted (Inside Vault Blob)

  • All transactions (amounts, merchants, dates, notes)
  • All categories (names, budgets, rules)
  • All accounts (names, balances)
  • Everything you actually care about

Plaintext (Metadata Only)

  • Your email address
  • Vault ownership (who owns which vault)
  • Encryption metadata (initialization vector and schema version for decryption)
  • Timestamps (when saved)

Try It Yourself: Live Encryption Demo

This demo uses actual AES-256-GCM encryption with PBKDF2 key derivation - the same algorithms we use in production. Edit any transaction below to see how all your transactions are bundled together into one encrypted vault blob (not stored row-by-row):

On Your Device - Readable to You
✓ All transactions readable by you
What We See On Our Server - Unreadable to Us
↑ All transactions encrypted as one blob
✗ Encrypted blob - we cannot decrypt

Note: This demo shows hex-encoded ciphertext for readability. The underlying encryption is AES-256-GCM with PBKDF2 key derivation, which is cryptographically secure. The key concept: your data is scrambled before it reaches our servers.

How the Encryption Works

When you create an account, we use PBKDF2 (Password-Based Key Derivation Function 2) to generate a cryptographic key from your password right in your browser. This key encrypts your vault using AES-256-GCM before it ever reaches our servers.

Your Password

Stays in your browser. Generates the encryption key that locks your vault.

Encryption

Happens client-side before sync. We only store the encrypted ciphertext.

Result

No password from you = no vault access for us (or anyone else).

What This Means For You

What You Gain

  • Your transactions are unreadable even if our database is breached
  • Your data cannot be sold, analyzed, or shared because we literally cannot access it
  • No employee can view your spending habits
  • No government subpoena can force us to hand over readable data we don't have

The Trade-offs (We're Honest About Them)

  • We can't recover your password. If you lose it, your data is permanently inaccessible
  • We can't provide server-side AI insights. All processing happens locally on your device
  • Customer support can't troubleshoot your budget without you sharing screenshots
  • No automatic bank connections. You import transactions manually via CSV

These aren't limitations. They're guarantees. We chose privacy over convenience.

Verify It Yourself

Don't take our word for it. Here's how to confirm that your data is encrypted before it leaves your browser.

Method 1: Browser Developer Tools

1

Open Developer Tools

Right-click anywhere on Sunny Budget and select Inspect. Go to the Network tab.

2

Trigger a Save

Add a transaction or update your budget. Look for a network request to /api/vault.

3

Inspect the Payload

Click the request and view the Payload or Request Body. You will not find your transaction names or amounts, only encrypted strings.

Method 2: Network Analysis (Wireshark)

For network engineers who want to verify our transport security (TLS) and ensure no side-channel connections are being made.

Wireshark Network Analyzer
# Step 1: Filter for Sunny Budget traffic
> ip.addr == [Sunny_Server_IP] && tcp.port == 443
# Step 2: Observe TLS Handshake
Client Hello (TLS 1.3)
Server Hello (TLS 1.3)
// Confirming high-security cipher suites are negotiated
# Step 3: Application Data
0000 17 03 03 00 48 00 00 00 ... . ... H ...
0010 a1 b2 c3 d4 e5 f6 01 23 ... [Encrypted Application Data]
Since we use HTTPS/TLS, Wireshark will only show encrypted transport packets. To see the actual application payload (to verify it is also encrypted), please use the Browser DevTools method above. Wireshark confirms we have a secure pipe; DevTools confirms we send secure data through that pipe.

Ready to take control?

Join thousands of users who value their financial privacy.