paiseh apps.paiseh.sg
← All apps

Nudge

Birthday and gift reminders with memory

Never forget a birthday — or scramble for a gift — again. Nudge reminds you with enough lead time to actually act, and opens every reminder straight into that person's gift history.

Status
Build-ready
Platforms
Web (PWA)
Role
Spec, design and build
Source
PaisehSG/nudge (private)
What it does
Context-rich reminders One pure function assembles the reminder payload and drives all three surfaces — card, push and email — so they can never disagree.
Gift memory Saved ideas and what you actually gave, plus sizes and preferences, so you never repeat a present by accident.
Delivery that reconciles A daily sweep recomputes what should have fired and dedupes against a delivery log. Catch-ups after a missed run never double-send.

A calendar can tell you it’s someone’s birthday today. That’s the moment it’s already too late to ship anything. Nudge reminds you two weeks out, and the reminder arrives carrying everything you need to act on it:

Mom’s birthday in 2 weeks (Aug 6). Last time: a wool scarf. Saved ideas: pottery class, that novel. Sizes: Shirt M · Shoe 8.

That context-rich reminder is the whole point — it’s the thing a calendar structurally cannot do. One pure function assembles that payload, and it drives all three surfaces (the on-screen card, the push notification, and the email) so they can never disagree with each other. Every reminder deep-links into the person’s page, where jotting an idea, logging what you’re giving, and marking it handled are one tap away.

Around that: people and recurring occasions, a gift memory that records both saved ideas and what you actually gave (so you never repeat yourself), sizes and preferences, a never-empty upcoming view, one-way .ics export, and a curated idea helper organised by relationship and interest.

How it’s built

React 18, Vite and strict TypeScript over Firebase — Auth, Firestore, Functions, Hosting, Cloud Messaging and the firestore-send-email extension — installable as a PWA. With no configuration it runs in demo mode on seeded sample people, so the dashboard, reminder card and all the date maths are live before you sign in.

Delivery is engineered, not hoped for

A reminder that doesn’t arrive is the only bug that matters here, so delivery is a reconciling sweep rather than a fire-and-forget job. A daily Cloud Function recomputes what should have fired since it last ran, dedupes against a per-reminder delivery log keyed by a deterministic occurrence key, and sends on both channels. Re-runs and catch-ups after a missed run never double-send. Each reminder’s per-channel result is logged, and the function raises a self-check alert if reminders were due but zero were delivered.

Email is treated as co-primary rather than a fallback, because web push on iOS PWAs is fragile. The in-app upcoming list is the real safety net, and it works offline through the PWA cache.

All the date maths is pure and exhaustively unit-tested — 77 tests covering leap years and Feb 29 under both observance policies, timezone offsets, daylight saving (9am local stays 9am across spring-forward), year rollovers, lead-time instants, and detecting when a gift no longer has time to ship.

Privacy

Nudge holds other people’s personal information — their dates, notes and sizes. It’s stored per-user and server-enforced owner-only, with no sharing surface and no contact scraping. Export and deletion are both available from Settings.