Problem
Students preparing for school attestation exams needed realistic timed practice, and their teachers needed a way to sell, run and grade it without building an app store presence. Everyone already lived in Telegram.
What I built
Everything, alone: the Mini App students use, the admin panel teachers use, the Django backend, the Telegram bot, and the server it all runs on.
Front · Telegram Mini App
- A full test runner: countdown timer, question navigator, flags, and appeals on individual questions.
- After each attempt: an answer map, a comparison with the previous attempt and a six-month progress chart.
- Free and premium catalogue, diagnostic tests, seasons with leaderboards and prizes.
- Three languages (Uzbek, Russian, English), light and dark themes that follow Telegram.
Behind · Servers
- Django 5 + DRF + PostgreSQL, split into focused apps: accounts, catalogue, attempts, seasons, payments, promos, appeals and courses.
- Sign-in with Telegram’s signed
initData, verified with HMAC on the server, so there is no password at all. - Card-transfer payments: the student uploads a receipt, an admin approves it, access is granted automatically.
- An aiogram bot for onboarding and broadcasts; nginx + gunicorn + systemd on a VPS.
Admin panel
- A dashboard with users, tests taken and a 14-day activity chart, plus a queue of payments waiting for approval.
- Subjects, tests and questions with free or paid pricing, time limits and an active / paused switch.
- Diagnostics, course groups, promotions, broadcasts, results, error reports and student feedback, in Uzbek, Russian and English.
Hard problems
- Trust without passwords — every request is tied to Telegram’s signature, checked on the server.
- Three apps, one release — the Mini App, admin panel and bot share one backend and deploy together to a single VPS.
- Manual payments at scale — receipt review is a queue with one-click approve, and access follows automatically.
Results
Live in Telegram with 1K+ users and 1K+ monthly active students.






