AMARAM Kottakkal Ayurveda · Healthcare · 2026
AMARAM
Ayurveda at home: therapist matching, video consultations and prescriptions — one app for patients, therapists and doctors.
- Role
- Full-stack developer at Bloom IT Solutions — backend API, database design, mobile app integration & UI, admin panel, integrations and VPS deployment.
- Platforms
- Android · Web admin · REST API
- Status
- Live · actively developed
home session
- Assigned
- En route
- Arrived
- OTP verified
- In progress
- Completed
Illustration of the system — not a screenshot.
- PostGIS therapist-matching radius
- 10 km
- PostGIS therapist-matching radius
- Roles in one app — patient, therapist, doctor
- 3
- Roles in one app — patient, therapist, doctor
- PostgreSQL tables
- 56
- PostgreSQL tables
- Lines of TypeScript, 3 apps
- ~170k
- Lines of TypeScript, 3 apps
Overview
Overview
AMARAM digitises an Ayurvedic clinic's two services — at-home therapy and doctor consultations. A React Native app with separate patient, therapist and doctor experiences, a Next.js admin panel, and a Node.js API on PostgreSQL + PostGIS.
The challenge
An Ayurvedic clinic runs two services that don't fit a normal booking app. Therapists travel to patients' homes, and doctors consult over video. That means finding the right nearby therapist, proving every session really happened, and settling money fairly when someone doesn't show up.
The approach
One Expo app with role-based experiences, a Next.js admin, and an Express + TypeScript API on PostgreSQL + PostGIS. Distance is real-world geography, sessions are verified with an OTP at the door and photo proof, video calls are guarded by Redis presence leases, and every rupee moves through idempotent, row-locked transactions.
Walkthrough
How it works
spec · 01
Therapists matched by real distance
- ›ST_DWithin(geography, 10 km)
- ›ORDER BY ST_Distance(…)
- ›free = sessions + travel buffer
- ›bid: Pending → Submitted → Accepted
- 01
Therapists matched by real distance
A booking opens an assignment request. Only therapists within 10 km who are actually free — counting an admin-set travel and packing buffer — can bid. Admins can also assign directly from a distance-sorted search.
spec · 01
Therapists matched by real distance
- ›ST_DWithin(geography, 10 km)
- ›ORDER BY ST_Distance(…)
- ›free = sessions + travel buffer
- ›bid: Pending → Submitted → Accepted
- 02
Proof at the patient's door
Therapists move through en route → arrived → OTP check → in progress → completed. A 6-digit OTP starts and ends the session, with start and end selfies and setup photos as proof. Earnings land in their wallet automatically.
spec · 02
Proof at the patient's door
- ›otp: 6 digits · 10 min · 3 tries
- ›photo window: 20 min after verify
- ›setup → start selfie → end selfie
- ›earnings → wallet at admin %
- 03
Video consults that survive bad networks
Slots lock during payment and release automatically if it fails. Agora calls use server-issued tokens; a Redis presence lease stops one consultation being joined from two devices, and background jobs catch no-shows every minute.
spec · 03
Video consults that survive bad networks
- ›slot: Available → Locked → Booked
- ›agora: server-issued RTC token
- ›presence lease: Redis · 120 s TTL
- ›cron/1m: no-shows · reminders
- 04
Prescriptions as real documents
After the call, doctors write prescriptions and treatment plans that are rendered to PDF on the server. A doctor can recommend a therapy, and the booking remembers where it came from.
spec · 04
Prescriptions as real documents
- ›puppeteer → prescription.pdf
- ›treatment plan + recommended therapy
- ›download: patient & doctor
- 05
Fair settlements, automatically
Every consultation is settled by who attended. A doctor no-show refunds the patient automatically; everything else goes to an admin review queue for a full or partial refund, a doctor payout, or retention.
spec · 05
Fair settlements, automatically
- ›doctor no-show → auto refund
- ›else → admin review queue
- ›lock order: payment → appointment → slot
- ›ref: CST-<date>-<seq>
- 06
Logins that don't break on bad networks
Mobile OTP and Google sign-in, with a separate path for doctors and therapists to register. JWT refresh rotation is tied to a server session with a short grace window — so a phone that lost a response mid-rotation stays logged in. Redis rate limits guard SMS OTP.

- 07
Deployed and documented
Running on a DigitalOcean VPS behind a cloud firewall, with Nginx, HTTPS, a systemd-managed API and PostgreSQL and Redis reachable only from localhost — plus an operations runbook for deploys, migrations and troubleshooting.
spec · 07
Deployed and documented
- ›nginx · certbot (HTTPS)
- ›systemd: api.service
- ›postgres + redis → localhost only
- ›runbook: deploy · migrate · debug
Launch
Store listing artwork
Marketing graphics from the Play Store listing — illustrative, not live app data.
Built with
Stack
- Backend
- Node.jsExpress 5TypeScriptWebSocketsZodPuppeteerPino
- Data
- PostgreSQLPostGISDrizzle ORMRedis
- Integrations
- RazorpayAgoraMSG91Google OAuthCloudflare R2Resend
- Infrastructure
- DigitalOceanNginxsystemdLet's Encrypt
- Admin
- Next.js 16React 19Tailwind CSSshadcn/uiRecharts
- Mobile
- React NativeExpoExpo RouterNativeWindTanStack QueryZustandAgoraFirebase FCM
Open to full-time roles & select freelance projects