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

- 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.
Related projects
E-learningCourseMate — E-learning Platform, Admin Portal & Android App
E-learning product across three surfaces: a React student app, a Material UI admin portal and an Android companion app on a shared Node/MongoDB API.
- React.js
- Vite
- Material UI
- Redux
- +6
Pharma / Field OperationsDelher — Pharma Field Operations Dashboard & Mobile App
Field operations product for a pharma client: a Material UI React dashboard with Leaflet mapping, plus an Android app for the team in the field.
- React.js
- Material UI
- Redux
- Leaflet
- +5