All projects

E-learning / Pharma

KnowledgePro Pakistan — Multi-Tenant Pharma Learning

Multi-tenant e-learning platform for pharma field teams: one codebase serving separately branded Ferozsons, Chiesi and EnteroLibrary portals.

  • React.js
  • Vite
  • Tailwind CSS
  • shadcn/ui (Radix UI)
  • Zod
  • Socket.IO
  • Node.js
  • MongoDB
  • nginx
KnowledgePro Pakistan — Multi-Tenant Pharma Learning — cover
Client
KnowledgePro Pakistan
Duration
Feb 2024 — Jan 2025
Category
E-learning / Pharma

KnowledgePro delivers training and medical reference content to pharmaceutical field teams in Pakistan. Rather than rebuilding per client, it runs as a multi-tenant platform: ferozsons, chiesi and enterolibrary each get their own subdomain, branding and content library, all served from a single React application.

The frontend is a Vite-built React SPA using Tailwind CSS with shadcn/ui components on Radix primitives, Zod for schema validation and Socket.IO for live updates. Each tenant boots the same bundle and resolves its theme, content scope and access rules from the host it was served on, with an SSO handoff for authenticated users coming from a client system.

The tenants share every feature but see none of each other's data — content isolation and role-based access are the load-bearing parts of the architecture, because the customers are competing pharmaceutical companies.

Key features

Multi-tenant architecture — Ferozsons, Chiesi and EnteroLibrary portals on one codebase

Per-tenant branding, theming and content library resolved at runtime

Training modules, quizzes and completion tracking for field teams

Role-based access for representatives, trainers and managers

SSO handoff so users arrive already authenticated from client systems

Real-time updates over Socket.IO and runtime validation with Zod

Accessible component layer built on Radix primitives via shadcn/ui

My role

Frontend lead on the tenant-facing platform.

  • Built the React/Vite SPA and the shared component layer on Tailwind and Radix
  • Implemented tenant resolution, theming and content scoping from a single bundle
  • Wired Socket.IO for live progress and content updates, with Zod validating every payload boundary
  • Integrated the SSO handoff and role-based route guards

Challenges & solutions

Competing customers on shared infrastructure. Ferozsons and Chiesi are rivals, so "mostly isolated" is not good enough. Tenant scope is resolved server-side and enforced on every request rather than trusted from the client, and no tenant-identifying state is cached across sessions.

One bundle, many brands. Shipping a separate build per tenant would have tripled the release work. Runtime theming via CSS custom properties meant a new tenant is a configuration entry, not a deployment.