- Role
- Founder & Lead Developer
- Platform
- Web, tablet and phone
- Type
- SaaS Platform
Overview
Clinoly replaces the spreadsheet, the paper appointment book and the filing cabinet that most small clinics still run on. A doctor opens it and sees who is waiting, who is next and what happened last time. A receptionist books, checks in and takes payment without ever seeing a clinical note.
It is designed for Morocco first, with French, Arabic with full right-to-left, English, dirhams and local phone formats. Nothing about the country is hard-coded: currency, tax, language and document formats are all configuration.
Built with
- Next.js 15
- React 19
- TypeScript
- Tailwind CSS
- TanStack Query
- NestJS 11
- PostgreSQL 16
- Prisma
- Redis
- BullMQ
- S3
- Docker
What it does
01
Front desk
Day, week, month and list calendars, a live waiting room, a waiting list that offers freed slots automatically, and reminders that never send twice.
02
Consultation
One screen from complaint to follow-up: vitals with trend charts, examination, structured diagnoses, prescriptions, and lab and imaging orders.
03
Billing
A price list, invoices, partial payments, refunds, receipts and branded PDFs, with every patient balance kept correct.
04
Patient access
A portal for appointments, prescriptions and invoices, plus a public booking page per clinic with its own QR code.
05
Insight
Role-specific dashboards, activity and revenue analytics, CSV and PDF reports, and an append-only audit trail.
06
AI, with the doctor in charge
It can summarise a history, structure notes or draft a referral. It never diagnoses, never prescribes and never writes to a record, and patient consent gates it.
Inside the product




How it is built
Isolation enforced twice
Every clinic is separated at the data layer. The boundary is checked once by a guard and again by every query.
Records are amended, never rewritten
Optimistic concurrency stops a second tab overwriting newer work, and a revision snapshot is saved before every change.
Scheduling rules live in the database
Double booking is prevented by the database itself, so no client bug can create a conflict.
Money never touches a float
Every amount is stored as an integer in minor units, from the price list to the final receipt.
Features are switches
Turning a capability off refuses it at the route and removes it from the navigation, the plans, the pricing table and the marketing pages, in all three languages.
One contract, shared
Types, validation schemas and the Prisma schema sit in shared packages, so the client and server cannot drift apart.
Next project
Masroufi
