2024
Volunteer Online Doctor System (VODS) — telehealth platform connecting patients in underserved communities with specialists worldwide. Marketing site, role-based dashboards, Stream video consultations, medical records with PDF export, and appointment scheduling. Next.js 14 frontend with Express + MongoDB API.
Overview
Volunteer Online Doctor System (VODS) is a telehealth platform built to connect volunteer doctors with patients who need care — with a focus on accessible healthcare for underserved communities.
The work spans three repos: vods/nextjs (Next.js 14, React 18, Tailwind, Radix UI, Redux Toolkit), vods/nodejs (Express 4 + Mongoose on MongoDB), and vods/mobile (Flutter companion UI). Auth uses JWT in httpOnly cookies with email verification and password reset via Nodemailer.
Public experience
The marketing site at vods-nextjs.vercel.app introduces the mission with an editorial hero, “How It Works”, and service pages:
- Online consultations — video calls, flexible scheduling, secure messaging, digital prescriptions
- Specialist referrals, health education, and community outreach
- About, FAQ, testimonials, volunteer, and contact
Legal pages cover HIPAA compliance, privacy, terms, and cookies. Public doctor discovery (GET /api/v1/doctors) powers the “Find a Doctor” funnel before sign-in.
Patient & doctor dashboards
Protected /dashboard routes split by role (patient, doctor, admin):
Patients — browse and filter doctors by specialization and rating, book slots against doctor availability, manage appointments (cancel/reschedule), join Stream video calls, view medical records, and leave post-visit reviews.
Doctors — set weekly schedules and unavailable dates, manage appointment queues and waiting lists, start consultations (creates streamCallId), write medical records (diagnosis, treatment plan, prescriptions), and schedule follow-ups. Doctor profiles support PMDC verification fields, license numbers, and ratings.
Medical records export as downloadable PDFs via @react-pdf/renderer.
Backend API
The vods/nodejs service exposes REST under /api/v1:
- Users — sign-up/in, email confirm, forgot/reset password, profile updates; admin user CRUD
- Patient — book/cancel/reschedule appointments, join waiting list, doctor availability
- Doctor — schedule CRUD, appointment status, follow-up scheduling
- Consultations — link appointments to Stream call IDs, track in-progress/completed state
- Medical records — doctor-authored records tied to appointments; patient read access
- Reviews — post-appointment ratings
- Threads — community posts with likes and nested comments
Admin endpoints aggregate dashboard stats, appointments, reviews, and medical-record oversight. Security middleware includes Helmet, rate limiting, mongo sanitization, and XSS cleaning.
Technical notes
Video calls use Stream Video SDK (@stream-io/video-react-sdk) with server-side tokens from @stream-io/node-sdk. Profile photos upload through Cloudinary server actions. Redux Persist keeps session state across dashboard navigation; Recharts powers admin analytics.
Community threads on /services/community-outreach/threads hit the live API; the outreach landing preview still uses static seed data. Patient messages and some admin pages (security, complaints) are UI placeholders. The Flutter mobile app has onboarding and home screens wired with a stub AuthService — API integration is not complete yet.