Skip to content
DheesoftDheesoft home
Back to work
Case study · Custom software

Bilingual school platform

A three-app system that puts a school's entire operation online — bilingual.

  • Live
  • Since May 2025
  • ~1,000 visits / month
School platform homepage hero

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

  1. 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.

  2. 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.

  3. 03

    A NestJS REST API with seventeen entity schemas on Postgres, JWT-protected staff routes, Drizzle migrations, seed scripts and Swagger UI docs.

  4. 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.

  5. 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.

  6. 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.

  7. 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.