MUMBAI, INDIA

You don't hand me a ticket. You hand me a problem.

I'm acting CTO at Dukaan Dost. Every module below started as an argument in a room and ended as something running in production — I was in the room, I made the call, I wrote the hard parts, and I get the phone call when it breaks. Five of those modules are written up here, decision first.

0
Engineers hired
0×
Faster API
0%
Manual entry removed
0k+
Judgments indexed
01 / THE PROOF

Six modules, start to production

Each of these began as a decision rather than a task. The conversation is included because that is where the engineering actually happened.

00

Why we built our own ERP

Forms and spreadsheetsOne system of record

The story every other module is a chapter of

The discussion

Orders were punched into a form and retyped into a spreadsheet. Stock went out to everyone as another spreadsheet, so the warehouse, the sales floor and the accounts desk each held a different file. Every decision was made by someone reading a sheet that was already out of date.

The call I made

Stop patching Excel and build the system underneath it. The cheap plan — lock the cells, share the file properly — left the real problem untouched, because a spreadsheet cannot tell you who changed a number or which copy is wrong.

What shipped

Structured order entry, stock modelled down to colour and roll, nineteen standing reports, and an uploader that reconciles the old spreadsheets against the database rather than banning them.

React 18Node.jsMongoDBRedisRead the case
01

Packing lists

Handwritten paperStructured data

90% of manual entry, gone

The discussion

Operators were retyping handwritten textile packing lists into the ERP by hand, every day. The obvious answer was OCR, and the obvious answer did not work: handwriting in mixed Hindi and English defeated every single-model pipeline we tried.

The call I made

Run two vision models over the same document and cross-check their structured output. One model was half the price, but nobody would have trusted it enough to stop double-checking — and a tool people double-check has saved nobody any time.

What shipped

Async ingestion on BullMQ, confidence surfaced per field, and a human review queue for the rows the models disagreed on.

GPT-4 VisionClaudeBullMQRedisRead the case
02

Permissions

A vendor quoteBuilt in-house

100+ routes, no third party

The discussion

We needed real role-based access across a hundred-plus routes. Buying it was faster on paper. The problem with buying it was that our access model would then live in someone else's schema, and every future module would have to ask their permission to exist.

The call I made

Build it. A Module → SubModule → Action tree, multi-role aggregation, and a two-tier cache — in-memory Map in front of Redis on a five-minute TTL — so the check costs nothing on the hot path.

What shipped

Denied-access audit logging, rate limiting and dynamic IP blocking, and a PermissionGuard component gating the UI against the same tree the API enforces.

Node.jsTypeScriptRedisRead the case
03

The legacy ERP

Busy, running the businessA modern stack beside it

Zero downtime through the whole migration

The discussion

Busy ERP was the accounting system the business actually ran on. A cutover weekend was the standard plan and the standard plan was unacceptable — if it went wrong on Saturday, nobody could invoice on Monday.

The call I made

Never migrate. Fence the legacy system behind a bridge service and let both run at once, so the modern stack never talks to Busy directly and either side can be rolled back on its own.

What shipped

Live stock and balance events over RabbitMQ with auto-reconnect and gzip decompression, two-way master-data sync across 8+ entity types, and CLI scripts with --dry-run before anything touched production.

RabbitMQNode.jsMongoDBRead the case
04

First paint

60 seconds5 seconds

12× faster, 3× API throughput

The discussion

The app took a minute to become usable. Operators had learned to open it and go make tea, which is the kind of workaround that tells you nobody expects the software to improve.

The call I made

Measure before touching anything. It was images and bundle weight, not the database everyone blamed — so the fix was boring and the database work we had queued up got cancelled.

What shipped

Reworked image pipeline and frontend bundles, then moved the platform to AWS on Docker with zero-downtime CI/CD, which tripled API throughput on the way.

DockerAWSReact 18
05

Notifications

Every service its own problemOne event, three channels

In-app, WhatsApp and email from a single emit

The discussion

Three services were each growing their own notification code, and each was about to grow its own retry bug. Channel routing was leaking into business logic everywhere.

The call I made

Services emit one event and stop caring. Routing, templating, retries, opt-in and delivery tracking are somebody else's job — a dedicated service on its own queues.

What shipped

Per-channel RabbitMQ queues, MD5 deduplication so a retry never double-sends, per-user channel opt-in, and delivery-status webhooks back to the source service.

RabbitMQWATIAWS SESNode.js
02 / WHERE I SIT

Four hats, one module

Decide

I sit in the room where the module gets argued about. What we are not building is usually the more valuable half of that conversation.

Architect

The shape before the code. Service boundaries, data model, what talks to what and what is deliberately fenced off from everything else.

Build

I write the hard parts myself — the permission tree, the bridge, the OCR pipeline — and review everything else that lands beside them.

Ship & operate

Zero-downtime CI/CD, and my phone is the one that rings. Owning production is what keeps the architecture honest.

03 / HOW I DECIDE

The rules I actually use

Boring survives Monday

The clever option and the option that still works when I am on leave are rarely the same option. I pick the second one and I am not sorry about it.

If it cannot roll back, it is not done

Every migration ran with --dry-run first and both systems live at once. Nothing ships that only works if it works.

Measure before you blame the database

It was images and bundles, not queries. The most expensive engineering is the kind that fixes the wrong thing beautifully.

Hire for slope

Six engineers since 2023, two of them interns who had production code merged inside a month. I would rather teach someone fast than wait for someone finished.

04 / NOW

Where I'm at

Currently

Acting CTO at Dukaan Dost, running the ERP I architected — three deployed services, 80+ data models, 100+ guarded routes — and the team of six I hired to keep building it.

Still writing the hard parts myself. Still on call for them.

Eight modules in production

Inventory Management

  • Products
  • Rentals
  • Barcode generation
  • Aging stock
  • Stock requests

Order Management

  • Order lifecycle
  • Active orders
  • Today's programme
  • Daily dispatch

Production

  • Production orders
  • RFQs
  • Open RFQ tracking

Purchase Inventory

  • Purchase flow
  • Supplier RFQs

Sample Management

  • Sample orders
  • Folders
  • Catalogue generation
  • Checkout links
  • Suspense accounts

HRMS

  • Payroll runs
  • Leave applications
  • Attendance regularisation
  • Clock in / out
  • 360 feedback

Sales & Marketing

  • Complaints
  • Catalogues
  • Customer orders

Reports & Analytics

  • Cross-module reporting
  • Masters
  • Task Hub
  • Company Buzz
05 / EXPERIENCE

Where I've worked

Senior Full Stack Engineer & Technical Leader @ Dukaan Dost

Aug 2023 to Present · Mumbai

I hired the whole engineering team and architected Dukaan Dost ERP, the B2B platform the company runs on.

  • Hired six engineers and converted two interns to full time. Both shipped production features inside four weeks, and one now owns the inventory module end to end with no oversight.
  • Architected and shipped Dukaan Dost ERP across three deployed services: a React 18 SPA, a Node.js and TypeScript API, and a RabbitMQ microservice. Eight modules run in production — inventory and rentals, order lifecycle and dispatch, production and RFQs, purchasing, sample management, HRMS, sales, and cross-module reporting — on 80+ MongoDB models and 100+ permission-guarded routes.
  • Moved the platform to AWS on Docker with zero-downtime CI/CD, which tripled API throughput. Initial page load fell from 60 seconds to 5 after I reworked images and frontend bundles.
  • Set up Prometheus and Grafana dashboards plus centralized ELK logging, so the team investigates incidents across services instead of guessing.
  • Ran one-week sprints and wrote the code review and branching conventions the six of us work from.
React 18Node.jsTypeScriptMongoDBRabbitMQAWSDocker

Full Stack Developer @ Priyam Innovations

Jun 2021 to Jul 2023 · Bangalore

Built billing, inventory and storefront software for a 10-store retail chain.

  • Shipped a MERN billing and revenue platform serving 10+ retail stores, with RBAC segmenting access by store role.
  • Reworked inventory and order flows. Stock shortages dropped 50% and restocking ran 60% faster.
  • Added product search, wishlist, cart, checkout and payments, then wrote a Node.js event handler that keeps stock in sync across platforms.
ReactNode.jsExpressMongoDBTailwind CSS
06 / PROJECTS

Things I've shipped

FLAGSHIP
AI · Legal

HelloVakeel

Legal intelligence platform for the Indian legal ecosystem. I collected and indexed 20,000+ Supreme Court judgments, then built a hybrid RAG pipeline over them: PostgreSQL BM25, pgvector cosine similarity on OpenAI text-embedding-3-large, and Cohere Rerank 3, all behind one SQL function with dynamic JSONB filters.

  • An 8-step case analysis pipeline covering brief extraction, precedent retrieval, loophole detection, evidence scoring and verdict probability, streamed to the UI over SSE.
  • Hallucination guardrails check every citation against source metadata, constrain section references to a validated picker, and refuse to generate on low-confidence retrievals.
  • A TipTap editor with custom nodes for inline rewrite, expand, simplify and section verification through Claude Sonnet, plus a highlight-to-template builder that turns selected text into reusable {{dynamic_fields}}.
  • Async ingestion on Celery and Redis using pdfplumber, falling back to AWS Textract for handwritten FIRs, with a classifier routing each document to type-specific prompts.
Next.js 14FastAPIPostgres 16pgvectorClerkCelery
Inventory showing one fabric quality expanded into thirteen colours, each with warehouse, transit and production quantities
Platform

Dukaan Dost ERP

The B2B ERP running Dukaan Dost. Inventory tracks multi-color and multi-roll products across five stock lifecycle states with QR scanning, critical stock alerts, aging reports and Excel-to-DB reconciliation. Orders move through create, authorize, dispatch and return, with partial dispatch scheduling and receivables tracking.

React 18Node.jsMongoDBShopify API
AI · Automation

Dual-AI OCR Pipeline

GPT-4 Vision and Claude read handwritten textile packing lists and return structured data, queued through BullMQ. Operators stopped keying in 90% of that data, and wider automation across dispatch and HRMS cut manual work 70%.

GPT-4 VisionClaudeBullMQRedis
The permission matrix for a role, with Order Management expanded into Broker, Buyer, Dispatch, Orders, Program and Transport
Security

RBAC & Security Layer

A Module to SubModule to Action permission model with two-tier caching in memory and Redis, multi-role aggregation, denied-access audit logs, and a PermissionGuard component gating the UI. Rate limiting and dynamic IP blocking stop brute-force attempts. No third-party vendor.

Node.jsRedisTypeScript
Infrastructure

Notification Microservice

Services emit one event and this handles the rest: channel routing to in-app, WhatsApp and email, template rendering, retries and delivery tracking. Per-channel RabbitMQ queues, per-user channel opt-in, MD5 dedup against duplicate sends, and status webhooks back to the source.

RabbitMQWATIAWS SESNode.js
Integration

Busy ERP Bridge

A Node.js service consuming live stock and balance events from Busy ERP over RabbitMQ with auto-reconnect and gzip decompression, syncing master data both ways across 8+ entity types. The legacy ERP and the modern stack stay decoupled, and operations never went down during the migration.

RabbitMQNode.jsMongoDB
Product

Gamification & HRMS

Points, levels and streaks that respect holidays and leave, a four-rarity badge system with auto-criteria awards, and a reward marketplace. HRMS covers geolocation attendance on Leaflet, leave accrual crons, and WhatsApp clock-out reminders with 3-tier escalation.

Three.jsReact Three FiberLeafletWATI
Real-Time

Real-Time Collaboration

Socket.IO over JWT-authenticated connections with room-based routing across tasks, subtasks and complaints. Each organization gets a workspace social wall with posts, comments and polls updating live.

Socket.IOWebSocketsRedis
07 / STACK

What I work with

Frontend

  • React 18
  • Next.js
  • TypeScript
  • Redux
  • Zustand
  • Tailwind CSS
  • Ant Design
  • Three.js / R3F
  • Chart.js

Backend & Data

  • Node.js
  • NestJS
  • Express.js
  • MongoDB
  • PostgreSQL
  • MySQL
  • Redis
  • FastAPI

Messaging & Real-Time

  • RabbitMQ
  • BullMQ
  • Socket.IO
  • WebSockets
  • SSE
  • Celery

Cloud & DevOps

  • Docker
  • Kubernetes
  • AWS EC2 / S3 / SES
  • CloudWatch / ASG
  • GitHub Actions
  • DigitalOcean
  • Prometheus / Grafana
  • ELK

AI & Integrations

  • OpenAI GPT-4 Vision
  • Anthropic Claude
  • pgvector
  • Cohere Rerank 3
  • AWS Textract
  • Shopify Admin API
  • WATI (WhatsApp)
  • n8n

Testing & Quality

  • Jest
  • Enzyme
  • Apache Bench
  • Code review
  • 1-week sprints

B.Sc Computer Science

Mumbai University · GPA 9.57 / 10.0

Data StructuresDBMSOOPSInternet ProgrammingAgile

Tell me what you're building.

I take on senior full stack and technical lead roles, and I answer email the same day.