🌐Web AppsYear: 2026Active development

Viyad

Production-ready multi-tenant online-classroom SaaS — WebRTC video, whiteboard, quizzes, recording, live at viyad.ir.

Viyad cover
Node.js 20 / Express 5React 19 / Vite 7MongoDB / MongooseRedis + Socket.io (Redis adapter)WebRTC / LiveKit / STUN-TURNStripe (billing webhooks)Twilio + Web Push (notifications)BullMQ (jobs)Elasticsearch (search)Sentry (monitoring)PDFKit / exceljs / fluent-ffmpeg

What it is

Viyad is a production-ready, multi-tenant online-classroom / live-teaching SaaS — a complete classroom experience: real-time WebRTC video, an interactive whiteboard, realtime-synced PDF materials, quizzes, chat, screen sharing and recording, all behind a React 19 frontend and a modular Node.js backend.

This is one of the largest projects in this portfolio — 513 backend files, 521 frontend files, 104 docs files, a full deploy/ directory (nginx, LiveKit, TURN, systemd) and a documented development history from Phase 1 to Phase 22.

Live: viyad.ir

Feature highlights

Classroom

  • Real-time WebRTC video/audio with STUN/TURN NAT traversal
  • Interactive whiteboard — draw, shapes, text, eraser, synced to the room
  • Real-time chat — public rooms + private DMs
  • Screen sharing
  • Recording — chunked upload with finalization
  • Role-based permissions — teacher vs student capabilities

PDF materials (جزوه)

  • Realtime follow: when the teacher opens the جزوه tab, every student’s PDF panel opens automatically; page navigation, scroll position and every annotation (pen, highlighter, line, shapes, text, eraser) sync to the whole room in real time. Late joiners receive the current share state instantly.
  • Auto font embedding: every uploaded PDF is scanned in the background and broken (non-embedded) fonts are replaced — Vazirmatn for Persian/Arabic pages, Inter for Latin — so text never renders as boxes. Fail-safe: on any error the original file is kept. A backfill script re-processes pre-feature PDFs.
  • Fullscreen with native Fullscreen API (+ CSS fallback for iOS)

Platform

  • Multi-tenant with organization context (34 frontend feature modules)
  • Admin dashboard with analytics (admin, admin-users, admin-settings, analytics…)
  • Billing webhooks — Stripe integration
  • Public landing CMS — editable features, FAQ, news, testimonials; SEO-friendly
  • Public API + developer API for third-party integrations
  • Quiz system, attendance, license, search, notifications (web-push + Twilio), PWA support, super-admin, role management

Architecture

viyad/
├── backend/                # Node.js/Express — modular monolith
│   └── src/
│       ├── config/         # env parsing & configuration
│       ├── core/           # logger, error handling, shared utils
│       ├── domain/         # entities & business rules
│       ├── application/    # use cases (business logic)
│       ├── infrastructure/ # DB repos, external services, media config
│       └── interfaces/     # HTTP controllers, routes, sockets
├── frontend/               # React 19 + Vite SPA (Feature-Sliced Design)
│   └── src/
│       ├── app/            # app shell & routing
│       ├── features/       # 34 feature modules (classroom, whiteboard, quiz…)
│       ├── shared/         # shared UI & utilities
│       └── providers/      # context providers (media, auth…)
├── packages/shared/        # shared types & contracts
├── deploy/                 # production config: nginx, LiveKit, TURN, systemd, logrotate
├── docs/                   # 104 files: ADRs, audits, phase reports (1–22), runbooks
├── scripts/                # DB/file backups, SSL, pdf-fonts (Vazirmatn/Inter)
└── docker-compose.dev.yml  # local dev stack (mongo + redis + backend + frontend)

Key dependencies

Backend: Express 5, Mongoose, Redis + @socket.io/redis-adapter, BullMQ, Stripe, Twilio, web-push, LiveKit SDK, Elasticsearch, Sentry, fluent-ffmpeg, PDFKit, exceljs, qrcode, zod, winston (+daily rotate), express-rate-limit.

Frontend: React 19, livekit-client, simple-peer, socket.io-client, pdfjs-dist, chart.js, framer-motion, idb, PWA.

Getting started

# Option A — Docker Compose (recommended)
docker compose -f docker-compose.dev.yml up
# backend → http://localhost:5000   frontend → http://localhost:5173

# Option B — manual
docker compose -f docker-compose.dev.yml up -d mongo redis
cd backend  && cp .env.example .env && npm install
cd ../frontend && npm install && npm run dev

Prerequisites: Node 20+, MongoDB 7+, Redis 7+.

Why it stands out

Viyad is the closest thing here to a commercial product. It has the full stack of a serious SaaS — realtime media infrastructure (WebRTC + LiveKit + TURN), horizontal scaling (Redis pub/sub), billing, multi-tenancy, search, monitoring, a deploy kit for real servers, and an engineering process documented in 104 docs files with audits and phase reports. The جزوه realtime-follow + auto font-fix feature alone — solving broken Persian fonts in uploaded PDFs at scale — is the kind of detail that separates shipped products from demos.

More projects