Bilingual school platform
A three-app system that puts a school's entire operation online — bilingual.
- Live
- Since May 2025
- ~1,000 visits / month

By the numbers
- Monthly visits
- ~1K
- Codebases
- 3
- Active
- 15mo
- Entity schemas
- 17
01The problem
Schools in Bangladesh typically run on paper, WhatsApp and a static HTML page. Admissions, donations, notices and library content live in disconnected systems — the school is invisible to prospective parents online, and staff have no single way to publish content. The school needed both a credible bilingual public presence (English + বাংলা) that handled admissions, donations, notices, faculty, audio and video, and a backoffice non-technical staff could actually use to manage every piece of that content without touching code.
02What we built
- 01
A bilingual (EN + বাংলা) public site with about thirty page templates spanning admissions, academic info, faculty, blog, events, audio library, video library, gallery, donations and a five-piece policy and legal set, with custom Bengali type for proper rendering.
- 02
A NextAuth-protected admin CMS with full CRUD on every public entity — admissions, blogs, books with chapters, audios, donations, contacts, faculty, notices, curriculum, departments, syllabus, history, goals — driven by TanStack Table list views and TipTap rich-text editing.
- 03
A NestJS REST API with seventeen entity schemas on Postgres, JWT-protected staff routes, Drizzle migrations, seed scripts and Swagger UI docs.
- 04
A two-level Books → Chapters resource where each chapter is authored in markdown, server-rendered via markdown-it and read on the public site as a long-form chapter page.
- 05
An audio player that accepts YouTube IDs and plays them through react-player, so the school's existing library of recorded khutbahs stays on free YouTube hosting while the public UI still feels like a native audio player.
- 06
A backup endpoint that zips the live Postgres dump together with every uploaded file into a single downloadable archive — survival insurance for a small VPS.
- 07
Three GitHub Actions pipelines, three Docker containers and one VPS — push to main, it ships.
03Stack
Public site
- Next.js 15
- React 19
- Tailwind 4
- Redux Toolkit Query
- Radix UI
- react-markdown
- embla-carousel
- react-player
Admin CMS
- Next.js 15
- NextAuth v4
- TipTap
- TanStack Table
- Redux Toolkit Query
- react-dropzone
- shadcn/ui
JSON API
- NestJS 11
- Drizzle ORM
- PostgreSQL
- JWT + Passport
- Multer
- markdown-it
- Swagger
- Jest
04Screenshots
05The hard part
The interesting decisions weren't about the stack — they were about modelling content that isn't a single text blob. Books became a two-level resource: each book has many chapters, each chapter is authored in markdown, rendered server-side and read as its own page. That meant a parent-child data shape with its own admin flow, its own public flow and its own rendering pipeline.
And the audio backend wasn't a backend at all. The school already had hundreds of khutbahs on YouTube. Rather than re-host on paid storage, the audio player accepts YouTube IDs and plays them through react-player — so the entire audio library is free-tier hosted while the public UI still feels like a native audio player. Those two choices turned what could have been another generic CMS into a system that fits how this school actually produces content.
Your move
Want one built around your operation?
We take on a small number of custom engagements per year. If this looks close to a problem you have, tell us about it.