Keepwise

reacttypescriptcloudflarepwaweb

Keepwise is a personal purchase ledger. Save what you bought, attach the receipt, record the return deadline and warranty you were actually given and get an email before either one runs out. No passwords, no browser tabs full of order confirmations and no invented store policies.

What it does

  • Purchases in under a minute. Only a product name and purchase date are required. Seller, price and currency, notes and receipts can be added later.
  • Receipts that stay private. Take a photo with the camera or drag in a PDF, PNG, JPEG, or WEBP up to 10 MB. Files are served through short-lived signed links — never public URLs.
  • Return windows you control. Enter the deadline yourself; Keepwise shows days left in your timezone and keeps surfacing purchases with no return date instead of guessing one.
  • Warranty and guarantee coverage. Track a separate coverage end date, with its own reminder schedule and an on/off switch that leaves return reminders alone.
  • Reminders before the deadline. One email on each day you select (on the day, 14, 30, 60, or 90 days before). Each reminder is sent once and changing a deadline reschedules the pending ones.
  • A dashboard sorted by urgency. Needs attention, open return windows, expiring coverage, missing return dates and recently expired — plus search, filters, archive/restore and mark-returned.
  • Passwordless sign-in. A six-digit code by email; no password to remember or leak.
  • A read-only demo. Sample purchases and deadlines, no email required, seeded from the sign-in screen.
  • Installable and honest offline. Add it to your home screen; the app shell loads offline and tells you when data needs a connection.
  • Delete everything. Account deletion removes purchases, receipts, reminders and sign-in from the server.

How it works

  1. Add a purchase: product, date and optionally seller, price, notes and receipt photos.
  2. Add the return deadline and/or coverage end date — the dates you were given, not an estimate.
  3. Pick how many days ahead to be reminded and confirm your timezone.
  4. Keepwise emails you on each selected day and keeps the purchase on the dashboard until you archive, return, or let the coverage expire.

Technical details

Frontend. A single-page React 19 app built with Vite and TypeScript, routed with React Router. Forms and API payloads are validated with Zod on the client before they are sent. Styling is hand-written CSS with OKLCH design tokens and a dark-first palette and Intl.DateTimeFormat / Intl.NumberFormat handle localized dates and currency formatting.

PWA and offline. vite-plugin-pwa generates a Workbox service worker that precaches the app shell and falls back to index.html for navigation. /api/* and all cross-origin requests are network-only, so the shell opens offline while purchase data is never served stale from cache.

API. A same-origin JSON API on Cloudflare, with endpoints for sessions, purchases, attachments, settings and account deletion. The purchase list is cursor-paginated rather than offset-paginated.

Auth. Passwordless email OTP using Better Auth’s email-OTP routes (/api/auth/email-otp/*), with an HTTP-only session and a separate demo endpoint that creates a read-only sample account.

Receipts. Uploads go directly from the browser to object storage using a short-lived signed upload URL; the API only stores the resulting storage key and filename. Viewing a receipt requests a fresh signed URL, so links expire and nothing is publicly addressable.

Dates and reminders. Deadlines are stored as date-only values at UTC midnight and compared against the user’s IANA timezone to decide what “today” is. That keeps “days left” stable across DST changes and travel, while reminders are queued per purchase and keyed to each selected day-before offset.

Deployment. Static assets and the API are served from the same Cloudflare origin under keepwise.bishal.page, which keeps cookies first-party and removes any CORS surface.

Why

Receipts end up scattered across inboxes, warranty PDFs get lost and return windows quietly close. Calendar reminders help only if you remember to create them and they don’t know the difference between a return deadline and a warranty.

Keepwise is deliberately narrow: it stores the receipt and the dates you give it, then reminds you once per chosen day. It never guesses a store’s policy, never invents a deadline and never makes a receipt link public.

Try it

keepwise.bishal.page — sign in with an emailed code, or open the read-only demo in one tap.