Skip to content
xanes.dev
All projects

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 · delete

Tech stack

Node.jsJavaScriptMongoDBRedisBull queuesTelegram Bot APIReact 19 Mini AppVercel + Render

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.