Nudge
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)
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.