A blockchain-based Electronic Health Record (EHR) system that links clinics together on a shared, tamper-proof network, enabling secure medical data exchange while keeping patients in full control of who can access and share their records.
HoloCura_Demo.mp4
- Core Features
- Tech Stack
- Third-Party Services
- Project Architecture
- Getting Started
- Contributing
- Team
- Acknowledgments
- Contact
| Role | Capabilities |
|---|---|
| Patient | Book appointments, view/add/edit/delete medical history, join online consultations |
| Doctor | Manage schedule, manage clinics, configure vacations, conduct online consultations, generate AI-powered SOAP transcripts, hire nurses |
| Nurse | View schedule, manage applications, complete appointments |
| Admin | Manage doctors, nurses, and clinics |
| Super Admin | Full system access, manage admins |
- Online Mode — Real-time video/audio consultations via Agora RTC
- Automatic audio recording during consultation
- SOAP note creation and editing
- Live chat between doctor and patient
- Meeting extension capability (doctor only)
- Session termination control
- Offline Mode — Traditional in-person appointments
- SOAP note creation and editing
- Consultation audio is automatically recorded and processed
- AI generates structured SOAP (Subjective, Objective, Assessment, Plan) notes
- Manual editing and confirmation workflow before finalizing
| Category | Technologies |
|---|---|
| Core Framework | Next.js 16, TypeScript |
| Styling & UI | Tailwind CSS 4, Shadcn, Lucide React |
| State Management | Zustand, TanStack React Query |
| Internationalization | next-intl |
| Real-time Communication | Socket.IO Client, Agora RTC SDK |
| Forms & Validation | React Hook Form, Zod |
| Utilities | Axios, date-fns, js-cookie, nuqs, react-easy-crop |
- Agora.io — Real-time video/audio infrastructure
- Google OAuth — Authentication provider
HoloCura follows a feature-based architecture, organizing code by domain feature rather than technical file type.
├── app/ # Next.js App Router pages
│ ├── (pages)/(dashboards)/ # Dashboard routes (patient, doctor, nurse, admin)
│ ├── (pages)/(auth)/ # Authentication routes
│ ├── (pages)/join/ # Join application routes
│ ├── api/ # API route handlers
│ └── layout.tsx # Root layout with providers
│
├── features/ # Feature-based modules
│ ├── appointment-session/ # Video/audio consultation sessions
│ │ ├── api/ # API calls
│ │ ├── components/ # Container/Presentational components
│ │ ├── hooks/ # Feature-specific hooks
│ │ ├── query/ # React Query hooks
│ │ ├── types/ # TypeScript types
│ │ └── utils/ # Utility functions
│ ├── clinics/ # Clinic browsing and booking
│ ├── dashboards/ # Role-specific dashboards
│ ├── home/ # Landing page components
│ ├── join/ # Nurse/Doctor join application
│ ├── settings/ # User settings management
│ └── user/ # User profile and authentication
│
├── components/ # Shared UI components
│ ├── ui/ # Reusable UI primitives (buttons, cards, etc.)
│ ├── layout/ # Layout components (Navbar, Sidebar, Footer)
│ └── common/ # Shared components (LanguageSwitcher, etc.)
│
├── lib/ # Core utilities and services
│ ├── apiClient.ts # Axios instance with interceptors
│ ├── socketClient.ts # Socket.IO client singleton
│ ├── auth.ts # Authentication utilities
│ ├── tokenRefresh.ts # Token refresh logic
│ └── helpers.ts # General helper functions
│
├── stores/ # Zustand state stores
│ ├── useUserStore.ts # User authentication state
│ ├── useSoapDraftStore.ts # SOAP notes draft state
│ └── ... # Other feature stores
│
├── contexts/ # React context providers
│ ├── LanguageProvider.tsx # Language/translation context
│ ├── QueryProvider.tsx # React Query provider
│ ├── ThemeProvider.tsx # Dark/light theme context
│ └── SocketProvider.tsx # Socket.IO provider
│
├── locales/ # Internationalization files
│ ├── en/ # English translations
│ │ ├── general/ # Common translations
│ │ ├── pages/ # Page-specific translations
│ │ └── dashboards/ # Dashboard translations
│ └── ar/ # Arabic translations
│
├── types/ # Shared TypeScript types
└── constants/ # Navigation items and static data
Each feature uses a container/presentational separation to keep data logic and UI rendering cleanly decoupled:
features/
└── dashboard/
└── components/
└── medical-history/
├── MedicalHistoryContainer.tsx # State management, data fetching
└── MedicalHistoryPresentational.tsx # Pure UI rendering
- Node.js 18+
- npm or yarn
npm install
# or
yarn installCreate a .env file in the project root with the following variables:
NEXT_PUBLIC_API_BASE_URL=http://localhost:3000
NEXT_PUBLIC_SOCKET_URL=http://localhost:3000npm run dev
# or
yarn devnpm run build
npm run startContributions are welcome! To contribute:
- Fork the repository
- Create a feature branch
git checkout -b feature/your-feature-name
- Commit your changes
git commit -m "Add: your feature description" - Push to your branch
git push origin feature/your-feature-name
- Open a Pull Request describing your changes
Please ensure your code follows the existing feature-based architecture and passes linting before submitting a PR.
| Name | Contact |
|---|---|
| Kareem Abdel Nabi | kareem-abdelnabi.vercel.app |
| Enjy Ashraf | enjyashraf18@gmail.com |
| Salah Mohamed | — |
| Youssef Aboelella | — |
- Dr. Amira Gaber
- Eng. Mohamed Adel
- Eng. Khalid Zahra
Special thanks to our supervisors for their invaluable guidance and support throughout the development of this project.
For questions, feedback, or collaboration inquiries, feel free to reach out to any of the team members listed above.