01 / Education
RITCanvas
The learning platform my college runs on, built and run by one developer.
Ramco Institute of Technology needed courses, assignments, quizzes, attendance and grades in one place. I designed, built and now run RIT Canvas on my own: the database, the backend, the web app, the Android app and the server it lives on.
- Role
- Sole developer: product, backend, web, Android, DevOps
- Built
- May 2026 to now, all 65 commits
- Users
- 2,139 students and 169 educators
- Hosting
- Fully self-hosted on our own server
Case file

01
The brief
Every lecture, deadline and mark in one workspace
The college wanted courses, assignments, quizzes, attendance and grades in a single workspace for students, teachers, TAs, heads of department and the institution head.
- Six roles, from student and TA up to HOD and institution head, with course access checked on the server.
- Only a course's owner can delete it, and HODs get read-only access to their department's courses.
- Each course gets a 2,000 MB file quota by default, raised with the institution head's approval.
02
What I built
Everything a classroom needs
A course hub with files and announcements, assignments graded against real rubrics, quizzes, attendance and a gradebook that rolls it all up.
- Departments, HOD dashboards, co-teachers and TAs, each scoped to what they should see.
- Attendance from real session activity: a class session with no heartbeat for 90 seconds counts as ended.
- Due-date reminders every hour, looking a day ahead, plus course ZIP export, support tickets and patch notes.
- Email fails over from Gmail to Brevo to Resend, and a provider that hits its quota rests for 30 minutes.

03
The hard part
Quizzes written from your own slides
Teachers upload a PDF, DOCX or slide deck. Docling turns it into text on our own server, and a language model drafts questions from the document's actual content for the teacher to review before anything is published.
- Long documents are split by page and grouped into 12,000-character chunks, so no single model call is too big.
- Each chunk is asked for about 1.8 times the questions it needs. Picks rotate across question types with up to three top-up rounds, and any shortfall is reported, not hidden.
- The model is a setting: a self-hosted Ollama or a hosted model. Behind the Cloudflare Tunnel, Ollama's context is raised to 32,768 tokens (it silently cuts prompts at 2,048) and answers stream so the tunnel's 100-second idle timeout never fires.
- Study notes come from a six-pass pipeline (map, fold, outline, section, wrap, diagrams) instead of one huge prompt.

04
Real-time
A live quiz arena for a full classroom
Teachers can also run a quiz live in class, with every phone on the same question at the same moment.
- The server stores each question's end time and a scheduled job closes it, with a 1.5-second grace for late answers.
- Phones correct their clocks against the server, so every countdown reaches zero together.
- Scores reward speed, with a streak bonus of up to 50%.
- players per live quiz
- 500players per live quiz
- cron jobs
- 5cron jobs
05
Running it
From Vercel to our own server
RIT Canvas went live on Vercel in June 2026. By late August it ran entirely on our own server: first a self-hosted Convex backend, then Dokploy, then 4 and finally 10 Docker replicas behind Traefik and a Cloudflare Tunnel.
- The image is a pruned Turborepo with a standalone Next.js build, running as a non-root user on Debian slim, because Alpine's DNS handling caused failed lookups.
- Server rendering reaches Convex over the internal network, skipping the round trip through Cloudflare.
- An in-process DNS cache with a stale fallback, and retries only for requests that are safe to repeat.
- Five cron jobs keep Docling warm, close silent sessions and abandoned quizzes, send reminders and recompute platform stats.
- Docker replicas
- 10Docker replicas
- CPU cores on the box
- 28CPU cores on the box

06
Sign-in
Sessions that behave
Better Auth runs the sign-in, with a few rules on top.
- Sessions roll for 60 days and are capped at three devices; a new sign-in retires the oldest.
- The Android app signs in by scanning a QR code on the web: a 32-byte token that works once and expires in 60 seconds.
- HSTS preload, frame blocking, and rich text sanitised before it renders.
07
My role
Built and maintained on the campus that uses it
I own it end to end: product design, about 54,000 lines of TypeScript across 55 database tables and 302 backend functions, the server it runs on, and a 17-screen Android companion app that students download from ritcanvas.in.

Built with
- Next.js 16
- TypeScript
- Convex (self-hosted)
- Better Auth
- Docling
- Ollama
- Docker
- Dokploy
- Traefik
- Cloudflare Tunnel
- Turborepo
- Expo
- React Native
next case file
RIT ERP
The college's enterprise system, built by a seven-person student team.
Read it