Expenses
Add receipt
Take photo or upload file
Receipts, invoices, PDFs
Tap to open camera or choose file
Reports
Settings
Signed in
One-time setup (~15 minutes):
- Install Node.js, then run:
npm install -g wrangler - Run
wrangler login— opens browser to sign in to Cloudflare (free account) - Create D1 database:
wrangler d1 create ninja-expense— copy the ID into wrangler.toml - Create R2 bucket:
wrangler r2 bucket create ninja-expense-receipts - Run schema:
wrangler d1 execute ninja-expense --file=schema.sql - Set secret:
wrangler secret put JWT_SECRET— type any random phrase - Deploy:
wrangler deploy— copy the Worker URL - Paste URL above → Test connection → then create your first user below
Add new user
Local storage used
Calculating…
Files uploaded to Cloudflare R2 are automatically removed from this device. "Clear files in cloud" manually removes any remaining local copies.
Security: Passwords hashed with PBKDF2 (100,000 iterations, per-user random salt). JWTs expire after 7 days. Login locked after 5 failed attempts. Admin role required for user/company management. All requests authenticated via the Cloudflare Worker.
Files: Receipts stored in Cloudflare R2 (private). Served via the authenticated Worker — files require a valid session to access.
Data: All users manage their own expenses and companies independently. Admin role is only for managing user accounts — admins do not see other users' expenses unless they turn on the "View all" toggle.
Tip: In Safari tap Share → Add to Home Screen for a phone app icon.