← BackHow Your Data Is Handled
Your subscription data never touches our database.
Data Flow
→→→Your Browser
store results
The server passes your file to Claude. It doesn't save it.
What Each Party Sees
Claude (Anthropic)
Your statement — To find subscriptions
Your Browser
The results — Stored in localStorage so you can see them
Just Cancel Server
Random ID + timestamp — To connect your payment to your scan
What's Stored Where
Your Browser (localStorage)
- Subscription names
- Amounts
- Cancel links
- Scan results
Cleared when you clear browser data or after 48 hours
Just Cancel Database
- Random ID for your scan
- Timestamp
- Whether you paid
Just enough to connect your payment to your scan
Anthropic (Claude)
- Statement sent for analysis
Anthropic's data retention policy applies
The Code
From the scan endpoint — this is what gets saved to the database:
app/api/scan/route.ts
.from('pending_scans')
.insert({
scan_token: scanToken,
expires_at: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),
});
And this is how results are saved client-side:
lib/scan-storage.ts
localStorage.setItem(
`jfc_scan_${scanToken}`,
JSON.stringify({
subscriptions: data.subscriptions,
ambiguous: data.ambiguous,
timestamp: Date.now(),
})
);
Your Browser Storage
Just Cancel data currently in this browser:
Loading...
Database Schema
The pending_scans table:
id: uuid
scan_token: text
expires_at: timestamp
paid: boolean
No columns for subscriptions, amounts, or transaction data.