-
-
Kept: receipts that remember your return windows and warranties, so you always know if you're still covered.
-
Every receipt becomes an Apple Wallet pass that shows the item, store, price and exactly when your cover ends.
-
AI fills in the item, merchant, total and line items for you. Check them, tap Save, and it's stored.
-
Kept builds a claim pack with a message to the seller, purchase details, cover dates and the receipt photo, ready to share.
-
Snap, read, add to Wallet, claim. Kept keeps every receipt and its deadlines in one place.
-
Green means you can still return it, red means the window has closed. Tap any receipt to see the full original.
-
Point your camera at any receipt. Kept finds the edges, reads the text and works out the return window and warranty.
Inspiration
My headphones died in month 13. The warranty ran 12. I had the receipt somewhere, a drawer, an email, eight thousand photos deep. Finding it was harder than just buying new ones, so I bought new ones. I spent two days thinking I was building a receipt scanner. That was wrong. Nobody wants a receipt filing app, because filing is work with no reward. What people want is a deadline they didn't have to set. The receipt isn't the product. The countdown is.
What it does
Point your camera at a receipt. Kept reads it, works out how long the item is covered, and drops a card into Apple Wallet next to your boarding passes. Two weeks before your cover ends, your phone tells you. When something breaks, you export a claim pack receipt, date, price, and warranty terms, one PDF ready to send to the retailer. Nobody opens a receipt app. Everybody opens Wallet. That's the bet.
How we built it
SwiftUI, SwiftData with CloudKit sync, Vision for on-device OCR, PassKit for the passes, Metal for the scan animation, and RevenueCat for the paywall. Two Cloudflare Workers, one signs passes, and one proxies extraction to GPT-4o mini through AI Gateway. The flow: camera -> Vision reads the text on-device -> the text, not the image, goes up -> structured data comes back -> you confirm it -> saved -> signed pass into Wallet. That confirmed step is load-bearing. Nothing saves until you check it.
Challenges we ran into
The private key can't ship in the app. If it's in the binary, anyone can extract it and mint passes that look like mine. So signing needs a server, which broke the whole pitch about receipts never leaving your phone. Then it clicked that signing doesn't need the receipt, it needs a hash. The phone builds the bundle and hashes it, the Worker signs the hash, the app zips it locally. The Worker signs a string of characters and has no idea what they represent.
Receipts are a lie. They look structured because they're printed in a grid, but there's no schema underneath. The total appears twice. Tax sits on its own line. 04/08/26 is August here and April in the US, and the warranty expiry hangs off that date. My regex parser got about half of them right.
I built for 20% of iPhones by accident. I started with on-device Foundation Models, which needs Apple Intelligence hardware, so the floor was iOS 26. I dropped that framework on day two and never revisited the deployment target. It sat there five more days protecting a dependency that no longer existed.
Accomplishments that we're proud of
Signing Wallet passes without the private key ever touching the app, and without a single receipt image reaching a server. Coming second demoing Kept at an NSManchester Shipaton special. And building it in public for six weeks, including the parts that broke.
What we learned
Measure before you switch. Everyone told me to use a cloud model. They were right, but I built a harness first: real receipts, expected values, every failure sorted into absent (the value was never in the OCR text, Vision's fault, no model fixes that) or wrong (the text was there, my code picked the wrong number a model fixes that). Mostly the second. So I know the model was the right call instead of hoping.
Constraints outlive their reasons. That iOS floor cost me nothing to fix and five days to notice. Nobody schedules a review of decisions that already got made.
Building in public is engineering input, not marketing. The question that changed the design came from a stranger: "Does it fail loudly, or does it quietly write a wrong number?" For anything with a date attached, that matters more than the accuracy rate.
I also changed my mind twice in public. Sync was going to be a Pro feature, it isn't, because an app that promises to remember for you shouldn't forget when you change phone. And I said "nothing leaves your phone" in my first post, then corrected it publicly when extraction moved to the cloud rather than quietly dropping the line.
What's next for Kept: Warranty Tracker
Insurance renewals, MOT certificates, anything with an expiry date, same product, same pass, same countdown. Not passports. That's PII going to a cloud model and a completely different privacy conversation. Plus App Attest on the Workers, and full email forwarding rather than just the share sheet.
Built With
- astro
- cloudfare
- openai
- revenuecat
- swiftui
- typescript
- vision
Log in or sign up for Devpost to join the conversation.