<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Bhuvanesh M P</title>
    <description>The latest articles on DEV Community by Bhuvanesh M P (@bhuvaneshmp15).</description>
    <link>https://dev.to/bhuvaneshmp15</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4070092%2Fbac4b18d-34d5-4a22-9816-abed97c173e1.png</url>
      <title>DEV Community: Bhuvanesh M P</title>
      <link>https://dev.to/bhuvaneshmp15</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bhuvaneshmp15"/>
    <language>en</language>
    <item>
      <title>AyurSutra: Why I Built a Treatment Engine, Not a Booking App</title>
      <dc:creator>Bhuvanesh M P</dc:creator>
      <pubDate>Sun, 09 Aug 2026 17:16:12 +0000</pubDate>
      <link>https://dev.to/bhuvaneshmp15/ayursutra-why-i-built-a-treatment-engine-not-a-booking-app-9cp</link>
      <guid>https://dev.to/bhuvaneshmp15/ayursutra-why-i-built-a-treatment-engine-not-a-booking-app-9cp</guid>
      <description>&lt;p&gt;Built for The ZerOps Challenge (@WeMakeDevs × @zeropsio)&lt;br&gt;
🟢 Live: &lt;a href="https://web-2c8a.prg1.zerops.app/" rel="noopener noreferrer"&gt;https://web-2c8a.prg1.zerops.app/&lt;/a&gt; 💻 Code: &lt;a href="https://github.com/bhuvaneshmp15-glitch/ayursutra" rel="noopener noreferrer"&gt;https://github.com/bhuvaneshmp15-glitch/ayursutra&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6n5evjs3v932r06nwhbh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6n5evjs3v932r06nwhbh.png" alt=" " width="800" height="403"&gt;&lt;/a&gt;&lt;br&gt;
Panchakarma Clinical Dashboard&lt;/p&gt;

&lt;p&gt;The problem nobody's solving&lt;/p&gt;

&lt;p&gt;Panchakarma — traditional Ayurvedic detoxification therapy — isn't a single appointment. A patient undergoing Basti therapy goes through 7 sessions across 3 distinct clinical stages (Purvakarma preparation, Pradhankarma primary treatment, Paschatkarma recovery) spread over 2+ weeks.&lt;/p&gt;

&lt;p&gt;The problem nobody's solving&lt;/p&gt;

&lt;p&gt;Panchakarma — traditional Ayurvedic detoxification therapy — isn't a single appointment. A patient undergoing Basti therapy goes through 7 sessions across 3 distinct clinical stages (Purvakarma preparation, Pradhankarma primary treatment, Paschatkarma recovery) spread over 2+ weeks.&lt;/p&gt;

&lt;p&gt;Yet almost every clinic manages this using tools built for booking a haircut: pick a date, pick a time, done. That mismatch causes real problems:&lt;br&gt;
--&amp;gt;No protocol memory — the system has no idea Session 4 depends on Session 3 being completed&lt;br&gt;
--&amp;gt;No conflict prevention — practitioners and treatment rooms get double-booked across overlapping sessions&lt;br&gt;
--&amp;gt;Broken continuity — vitals, pulse diagnostics, and clinical notes end up scattered across paper files instead of tied to a specific treatment stage&lt;br&gt;
So I built AyurSutra — a system that treats Panchakarma as what it actually is: a stateful, multi-stage clinical protocol.&lt;br&gt;
What it actually does&lt;/p&gt;

&lt;p&gt;When a practitioner selects a therapy type (Vamana, Virechana, Basti, Nasya, or Raktamokshana), AyurSutra:&lt;/p&gt;

&lt;p&gt;1.Auto-generates the complete session sequence across all three stages&lt;br&gt;
Assigns a practitioner and checks for scheduling conflicts at the database transaction level&lt;br&gt;
2.Auto-shifts any colliding session to the next open time slot, instead of just rejecting the booking&lt;br&gt;
3.Tracks stage-linked vitals (Nadi pulse, BP, weight) as structured data, not loose notes&lt;br&gt;
4.Serves the daily schedule from a Valkey cache so the dashboard loads instantly, even under load&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8b5rt6mnsgdyt7a4zb4h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8b5rt6mnsgdyt7a4zb4h.png" alt=" " width="638" height="818"&gt;&lt;/a&gt;&lt;br&gt;
Pick a therapy type — the backend generates the entire multi-week protocol automatically.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzws53t6eu26ona4cicc3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzws53t6eu26ona4cicc3.png" alt=" " width="800" height="378"&gt;&lt;/a&gt;&lt;br&gt;
Every patient's journey is tracked stage by stage — not just as a list of appointments.&lt;br&gt;
Architecture — built to actually use Zerops, not just deploy on it&lt;/p&gt;

&lt;p&gt;I wanted this to genuinely demonstrate multi-service infrastructure, not a single monolith with a database bolted on. Here's the full stack, all running on Zerops:&lt;/p&gt;

&lt;p&gt;Client Browser&lt;br&gt;
     │&lt;br&gt;
     ▼&lt;br&gt;
web (nginx) ── serves React frontend, proxies /api to →&lt;br&gt;
     │&lt;br&gt;
     ▼&lt;br&gt;
api (Bun + Hono) ── the core engine&lt;br&gt;
     │&lt;br&gt;
     ├──► db (PostgreSQL) ── patients, plans, sessions, vitals&lt;br&gt;
     ├──► cache (Valkey) ── today's schedule, sub-ms reads&lt;br&gt;
     └──► storage (S3) ── clinical documents, progress photos&lt;/p&gt;

&lt;p&gt;worker (Node.js) ── runs every 2 minutes:&lt;br&gt;
     re-audits conflicts, syncs Valkey cache, logs reminders&lt;/p&gt;

&lt;p&gt;Six services, one project, wired entirely through Zerops' internal networking — no manual VPC config, no separate hosting for each piece.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd61zjmy0oumr381wc57k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd61zjmy0oumr381wc57k.png" alt=" " width="605" height="710"&gt;&lt;/a&gt;&lt;br&gt;
All six services, one Zerops project, zero manual networking config.&lt;br&gt;
The interesting engineering bit: conflict auto-shifting&lt;/p&gt;

&lt;p&gt;Most booking systems just reject a request if there's a conflict. I didn't want that — a practitioner shouldn't have to manually retry five times to book a valid slot. Instead, the scheduling engine runs inside a Postgres transaction, checks for interval overlaps against existing sessions:&lt;/p&gt;

&lt;p&gt;ts&lt;br&gt;
candidateStart &amp;lt; slot.end &amp;amp;&amp;amp; candidateEnd &amp;gt; slot.start&lt;/p&gt;

&lt;p&gt;If it finds a collision, it automatically walks forward through the day's slot grid (09:00, 10:30, 12:00, 14:00, 15:30, 17:00) until it finds one that's free — and logs the shift so it's fully auditable.&lt;/p&gt;

&lt;p&gt;Why Valkey matters here&lt;/p&gt;

&lt;p&gt;The clinical dashboard needs to load instantly — a practitioner glancing at "who's next" shouldn't wait on a SQL query. The background worker recomputes and writes today's full schedule into Valkey every 2 minutes (ayursutra:today_schedule), and the dashboard reads from there first, falling back to Postgres only if the cache is cold. That's the difference between a demo that feels production-grade and one that doesn't.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhytx16k3jip0807i6sqr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhytx16k3jip0807i6sqr.png" alt=" " width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Live schedule, served from cache — not a database query on every page load."&lt;/p&gt;

&lt;p&gt;What's next&lt;/p&gt;

&lt;p&gt;If I keep building on this: WhatsApp/SMS reminders triggered off the worker's queue, multi-clinic support for practitioner networks, and a mobile companion app for practitioners to log Nadi diagnostics hands-free during a session.&lt;/p&gt;

</description>
      <category>zerops</category>
      <category>hackathon</category>
      <category>healthcare</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
