Inspiration

Everyone has bought something, meant to return it, and discovered the window closed last week. Retailers all have different policies - 14, 30, 90 days, final sale, holiday extensions - and the receipt with the answer is buried in email. The cost of missing a deadline is real money. We wanted a tracker that is honest about its limits: it knows only the policy you tell it, it does the date math perfectly, and it never phones home.

What it does

ReturnReady is a private, offline-first purchase tracker. You add a purchase with its date and return policy (a number of days or a specific return-by date). It computes the exact deadline with calendar-day math, shows live countdowns, and flags what's urgent, active, overdue, or returned. Stats stay consistent: expired items leave the open-return count and value totals, and show up as windows closed. Attach receipt photos and they sit in IndexedDB on your device. No account, no server, no analytics - localStorage and IndexedDB only.

How we built it

Plain HTML, CSS, and JavaScript. Deadlines use local-midnight calendar math (not elapsed hours), so "30 days from Oct 1" means the same thing a store's policy page means. Receipts are stored as blobs in IndexedDB with a thin promise wrapper. State lives in localStorage behind a small schema-versioned store. Filters, urgency tiers, and stat cards all derive from one render pass over the same data, which is how the counts stay consistent.

Challenges we ran into

Date math is the whole product and it is full of edge cases: timezones, DST, and the difference between 30 x 24 hours and 30 calendar days. We also caught a consistency bug late - when overdue items were excluded from the active set, the "windows closed" stat silently broke because it was derived from that same set. It now derives from the source list, and the test suite pins the behavior.

Accomplishments

The app is honest about expired windows - "10 days overdue," never a confusing negative countdown - and the stats never contradict the list. It works fully offline after first load and survives reloads.

What we learned

That a "simple tracker" is really a correctness problem in calendaring, and that deriving every displayed number from one source of truth is what keeps a UI trustworthy.

What's next

Optional reminder notifications, policy templates for common stores (clearly marked as user-confirmable), CSV export, and a PWA install prompt.

Built with

JavaScript, IndexedDB, localStorage, HTML, CSS. No frameworks, no backend.

Built With

Share this project:

Updates

Submission history