MyCalendar — Calendar with Smart Reminders
Project Info
- Client Self-funded SaaS
- Year 2025 → present
- Category SaaS / Productivity
- Stack Next.js 16, React 19, TypeScript, Tailwind v4, Prisma 7 + Postgres, NextAuth v5, Twilio, Brevo, WayForPay, Expo (TWA)
Project Description
MyCalendar is a free online calendar with multi-channel smart reminders that I built end-to-end. Users add birthdays, deadlines, and one-off or yearly-recurring events; the service then nudges them via email, Telegram, or — for voice subscribers — an actual Twilio phone call in the user's own language (EN, ES, RU, UK), placed at the user's local time, with WhatsApp reminders next. Native apps are live in the App Store and on Google Play. Voice is $10/month for up to five calls a day, with three free calls to try; the UI ships localized into 19 languages.
2026 update — a calendar you can talk to. The newest addition is a conversational AI assistant. You say or type a date in your own words — “Mum’s birthday is the fourth of September, every year” — and she reads it back, then offers it as a ready-to-save entry. She works in 20 languages, sees the events already on the calendar so she never asks for the same date twice, and answers out loud with an avatar whose face moves in time with her voice. By design she never writes to the calendar herself: every date stays a suggestion until the user presses Add to calendar. Each account carries a daily conversation budget, so a long chat cannot run up the bill.
Under the hood: a Next.js 16 App Router app (Server Components, Server Actions, Prisma 7 + Postgres) plus a small cron worker that polls every five minutes. Two parallel API surfaces share the same service layer — session-based for the web dashboard, JWT-based (15-minute access / 30-day refresh tokens) for the Expo TWA mobile app. Auth via NextAuth v5; payments via Wayforpay with HMAC-MD5-signed callbacks; transactional email via Brevo SMTP.
The interesting parts: a timezone-correct dispatch path that converts each user's stored HH:MM into UTC send-times via Intl.DateTimeFormat (no naive Date math); recurring events that auto-reset sentAt each year; and atomic claim-before-dispatch on the voice channel so two overlapping cron runs can't double-bill a Twilio call. Multilingual UI (19 locales) shared between the web app and the mobile TWA.


