Work / Aakalan / Wiki / Concepts
receipt-is-one-photo
Conceptverified 2026-10-30
receipt-is-one-photo
A receipt is one photo, and saving an expense never waits for it. The expense is written
immediately and the image queues behind it (receipt-queue.ts, on disk, device-local),
because offline is the normal case.
receiptPathis written to the expense only after the upload lands. Writing it up front shows every other member a path to an image that is not there.- Resized to a 1600px long edge and re-encoded as JPEG before leaving the device. A bill is legible at that size; a 12MP original is six megabytes of someone's data plan.
- Nothing is read out of the image. No OCR, no amount guessed, no category inferred. An app that quietly fills in ₹6,200 from a blurry total will one day fill in ₹62,000.
- Deleting the expense deletes the image for real, the one thing that is not soft-deleted. See a-record-is-never-erased.
- The camera button is visible on free with a Pro mark, not hidden. A feature nobody can see is a feature nobody buys, and hiding it would make the row appear from nowhere on subscribing.
storage.rules mirrors firestore.rules path for path: a receipt is readable by
exactly the people its expense is readable by. The two deploy together; shipping one
without the other is how an image ends up reachable under an expense that is not.
Related: local-first-ledger, expense-receipt