Shipped
Whispr
An AI-powered Telegram reminder bot — understands natural language scheduling requests via NLP, backed by a Redis-based job queue for reliable delivery. Live and in daily use.
Overview
Whispr is an AI-powered Telegram reminder bot: say 'remind me to submit my assignment tomorrow at 11pm' and it parses the request, schedules it, and fires a notification at the right time. A Telegram Mini App provides a visual dashboard for managing everything you've set. It is live and in daily use.
Problem
Reminders fail at the capture step: opening a dedicated app, filling a form, and setting a date is enough friction that most intentions never become reminders. The place people already write things down — chat — is where scheduling should happen.
Solution
Whispr lives inside Telegram. Natural-language messages are parsed for intent and time, scheduled onto a Redis-backed job queue, and delivered as Telegram notifications at the right moment. The Mini App — a React app running inside Telegram — gives a dashboard view: list, edit, and delete reminders, plus timezone and locale settings.
Architecture
The backend is Node.js with MongoDB for persistence (reminders, messages, users) and Bull workers on Redis for scheduled delivery — reminders are queue jobs, so delivery survives restarts and retries transient failures. Telegram ingress arrives via a secret-verified webhook route; the Mini App API authenticates every request with Telegram initData, and health/readiness endpoints (Mongo + Redis checks) support deployment.
The Mini App is a React 19 front-end deployed on Vercel; the backend deploys on Render with managed Redis and MongoDB.
Telegram message ──► webhook (secret-verified)
│
▼
NLP parse (chrono-node) — intent + time
(per-user timezone state)
│
▼
MongoDB (reminders) + Bull queue on Redis
durable jobs · retries
│ fires on schedule
▼
Telegram notification
Mini App (React) ──► /api (initData auth) ──► list · edit · deleteTech stack
Challenges
- Natural-language time is ambiguous by default — 'tomorrow night', locale formats, and timezones all resolve differently per user; per-user timezone state is load-bearing.
- Reliable delivery means treating reminders as durable queue jobs with retries, not setTimeout calls — the queue is the product.
- Telegram's two auth surfaces (webhook secret for ingress, initData for the Mini App API) had to stay strictly separated — the webhook route deliberately sits outside the authenticated /api prefix.
Lessons learned
- Meeting users inside a platform they already have beats shipping another app — distribution is a feature.
- A job queue with observability hooks (depth, retries, DLQ) is the difference between 'usually fires' and 'fires'.
- Health and readiness endpoints from day one make small deployments boring in the best way.
Future improvements
- Recurring reminders.
- Voice note input.
- WhatsApp support.