Backend & AI engineer · Delhi NCR · IST · remote

Production Node.js and PostgreSQL. AI agents and MCP servers.

Founding engineer at TaskTap.ai: 181+ REST APIs live with 6 organisations, a React Native app for Android and iOS, and read-only AI tooling that debugs production without being able to change it. I do the same work for founders, agencies and SaaS teams.

TaskTap.ai · system sheet rev 2026.10

Clients

Web appNext.js
AndroidReact Native · internal testing
iOSReact Native · TestFlight
API · Node.js + Express181+ REST routes · JWT with refresh rotation · RBAC · TOTP 2FA · Socket.io
PostgreSQLPrisma · migrations
Redis + BullMQreminders · recurring work
IntegrationsWhatsApp · Razorpay · AppSumo
MCP observability server54 tools · reads logs, queues, db, nginx, git
read-only

Docker · GitHub Actions · DigitalOcean · Nginx

181+

REST APIs in production

6

organisations on TaskTap

54

read-only MCP tools

33

mobile screens · Android + iOS

Services and prices

Fixed-price first steps. Prices in USD.

01 · Audit

300 USD

A written report and a short video on your app, workflow or backend, most urgent first. Credited toward the work if you go ahead within 14 days.

02 · First fixed job

from 300 USD

One small job with a fixed price and a clear finish line. You see my work before anything bigger.

03 · Project

from 1,500 USD

A bigger piece of work with a fixed quote, agreed in writing before I start.

04 · Monthly

from 500 USD/month

Upkeep, fixes and new work each month, if you want it.

"From" prices are starting prices. The final price is fixed in writing before any work starts.

01 · WhatsApp and payments

WhatsApp Business API and payments automation

Order updates, reminders, OTPs and payment links on WhatsApp, with Razorpay or Stripe behind them. I run this in production now: WhatsApp reminders billed from a prepaid wallet, and Razorpay subscriptions including UPI Autopay.

WhatsApp Business APIRazorpayStripeWebhooks
  • First stepOne WhatsApp flow live on your number, such as order updates or remindersfrom 400 USD
  • ThenPayments added: checkout, subscriptions and webhooksfrom 500 USD

02 · Automation with AI

n8n and AI automation

New leads go straight into your CRM, AI sorts incoming emails and tickets, and reports build and send themselves. Built in n8n or in code, with a person approving any step that matters. In an earlier role I automated client PDF reports and cut the manual work by over 90%.

n8nAI stepsCRMReports
  • First stepOne workflow, built, tested and handed over with a short videofrom 650 USD
  • ThenUpkeep and new workflows every monthfrom 650 USD/month

03 · For agencies

Backend overflow for agencies

When your team is full, I take on Node.js and PostgreSQL backend work and deliver it under your brand, in your repo and your process, under NDA. You own the client and I never contact them. I lead the backend of a multi-tenant B2B SaaS with 181+ REST APIs, live with 6 organisations.

Node.jsPostgreSQLYour brandNDA
  • First stepA paid trial task under NDA, so you can judge my code and communicationfrom 300 USD
  • ThenA fixed quote per modulefrom 1,500 USD
  • OrA monthly block of 60 to 80 hoursfrom 2,800 USD/month

04 · Quick fixed jobs

DevOps and app upgrades

Small jobs with a clear finish line. Your app deployed with Docker and CI to your own server, or your React Native or Expo app upgraded when the app stores raise their requirements. I run production on Docker, GitHub Actions, DigitalOcean and Nginx.

DockerGitHub ActionsNginxExpoReact Native
  • Fixed jobDocker and CI deploy to a VPS, with HTTPSfrom 300 USD
  • Fixed jobExpo or React Native upgrade and store resubmissionfrom 400 USD

Also

Fix an app built with AI tools

Built with Lovable, Bolt or Cursor and now has real users? I fix auth, database access rules, payments and deploys. No rewrite, and every change lands in your GitHub.

  • First stepThe audit300 USD
  • ThenA fix sprint of 1 to 2 weeksfrom 1,500 USD

MCP servers and AI agents

AI connected to your database, logs or internal APIs through an MCP server. Read-only by default. Write access is added only on purpose, with a person approving it. See case study 1.

  • First stepMCP starter: 3 to 6 tools, auth, docs and a demofrom 1,500 USD

How it starts

  1. You send a few linesWhat the product does, what it runs on, what is in the way.
  2. I reply within a dayWith questions, or straight away with a suggested first step and its price.
  3. A small, fixed first stepThe 300 USD audit or one fixed job. You decide what comes next.
Tell me what you're building

Case study 1 · AI operations · 2026

AI that debugs production, but cannot change it

A multi-tenant B2B SaaS, live with 6 organisations. I lead its architecture and backend. I built a way for AI to investigate its production problems and propose fixes, with a person in charge of every change.

54

read-only tools

181+

REST APIs it watches

6

organisations in production

2

human approvals per fix

The problem

When something broke, the answer was spread across logs, queues, the database, the containers and Nginx. Searching all of it by hand was slow. Giving an AI tool the keys to production was not an option.

What I built

  • An MCP observability server with 54 read-only tools: logs and error clusters, BullMQ queues, PostgreSQL, Nginx, Docker, deploy history and server health.
  • An AI-assisted fix workflow with Claude and Codex. It takes production errors and tickets, gathers evidence through the server, writes a report where every claim cites that evidence, and proposes a fix.

How it stays safe

  • Read-only is enforced in code, not in a prompt. A SELECT-only database role with secret columns hidden, a SQL validator, read-only transactions, and every call logged with a data budget per session.
  • A person approves the plan. The fix is built in its own git worktree and tested in a container with no network. A person approves again before it merges. Nothing merges or deploys on its own, and the lead developer gets a report on every fix.

For your team: the same pattern works on your systems. An MCP starter with 3 to 6 read-only tools is from 1,500 USD. Not sure what to connect first? Start with the 300 USD audit.

Case study 2 · Mobile · 2026

A parser that learns from its own mistakes

Spendly is an expense tracker that reads your bank and UPI SMS instead of asking for a bank login. Every Indian bank and UPI provider writes its SMS differently, so the parser is the whole product.

30+

banks and UPI providers parsed

20+

testers on Google Play

39

messages in the app/server parity test

70

confidence score to auto-file a transaction

The problem

The first on-device SMS parser only covered the message formats I had tested myself. Testers on Google Play internal testing saw incomplete expense data every time a bank phrased a message a little differently, and a missed message is money the user can't see.

What I built

  • Collected real SMS samples and feedback straight from testers, then reworked the transaction engine: merchant learning, duplicate detection with a hash key shared by app and server, and normalisation across bank formats.
  • A confidence score per transaction. Anything under 70 is kept as "unverified" instead of silently dropped, so a parsing miss is visible instead of lost.
  • Offline-first sync that re-reads the last 60 days whenever the parser improves, so a fix recovers old transactions, not just new ones.

How it stays accurate

  • A 39-message parity test keeps the on-device parser and the server parser in agreement, so a change on one side can't silently drift from the other.
  • Every release on Google Play internal testing is shaped by what the 20+ testers report, not by what I assume their bank's SMS looks like.

For your team: the same approach works on messy real-world input your app depends on: SMS, emails, webhooks, scraped pages. Start with the 300 USD audit, or a fixed first step to get a rough parser to production-accurate.

Proof

Things I have built and run. Details further down.

MCP · in production

MCP observability server

54 read-only tools that let Claude debug production: logs and error clusters, queues, database, Nginx, containers and deploy history. Read-only is enforced in code, not in a prompt.

Read case study 1

AI workflow · Claude + Codex

AI remediation workflow

Claude and Codex turn production errors into fixes: evidence first, then a cited report, then a fix built and tested in an isolated worktree. A human approves the plan and again before anything merges.

See the flow

B2B SaaS · multi-tenant

Multi-tenant SaaS platform

181+ REST APIs on Node.js and PostgreSQL, live with 6 organisations. Tenant-aware auth with roles and two-factor, subscription billing, queued reminders and CI that blocks a bad deploy.

Read the details

Side project · Android

Spendly

An expense tracker that reads bank and UPI SMS, so there is no bank login. The parser covers 30+ Indian banks and UPI providers, with 20+ testers on Google Play internal testing.

Read case study 2

Built in one day

AI fitness tracker

An AI-powered fitness tracker I built end to end in a single day: how quickly a first version can go from idea to a working app.

Daily tool · multi-agent

My multi-agent assistant

Runs on my Mac. I hand it jobs from my phone and worker agents do them, each in its own git branch. Anything risky, like pushing code or sending a message, waits for my approval, and production is off-limits.

Work

Four things I have built and run. Newest first.

Mobile · Android + iOS · Sep–Oct 2026

TaskTap Mobile

The native companion to TaskTap for the people who are never at a desk: site supervisors, field sales, clinic managers. Owners, managers and doers each get their own home screen, and work can be created by voice, approved or sent back, and chased by push notification.

  • React Native 0.87 on the New Architecture, React 19, TypeScript. 33 screens across three roles, navigation per role, light and dark themes generated from the design-system tokens.
  • Push notifications with reply from the notification, Socket.io chat, voice-to-task in Hinglish, Face ID or passcode app lock, photo and document uploads.
  • Took the iOS port from "does not build" to running for all three roles on iOS 26, then TestFlight: 17 fixes across sheets, keyboard layout, Firebase setup and the UIScene lifecycle. 362 unit tests pass.
  • Led the app with the intern I hired; owned the backend side (mobile sign-in, push, automatic device sign-out) and the iOS port.
React Native 0.87TypeScriptReact NavigationFirebase MessagingNotifeeSocket.ioKeychainJest

Android: internal testing with TaskTap customers · iOS: on TestFlight, October 2026

TaskTap new task screen with voice input: tap to speak your task in Hinglish, Hindi or English
TaskTap task detail: attached guidelines, WhatsApp delivery receipt, voice note and activity timeline
TaskTap approvals screen with three tasks waiting for review

Android internal-testing build, October 2026, demo organisation.

B2B SaaS platform · Jan 2026 → now

TaskTap.ai

A multi-tenant workspace for Indian teams that still run work over WhatsApp, Excel and follow-ups. Tasks, approvals, recurring work, meetings, chat and a KPI score that feeds the leaderboard. Six organisations use it in production. I am the engineer behind all of it.

  • 181+ REST APIs on Node.js, Express, PostgreSQL and Prisma. Event-driven jobs on BullMQ and Redis for reminders, recurring tasks and notifications; Socket.io for live collaboration.
  • Multi-tenant auth: JWT with refresh-token rotation, role-based access, TOTP two-factor. Razorpay subscriptions including UPI Autopay, WhatsApp Business API reminders metered from a prepaid wallet, AppSumo licensing.
  • The fair KPI clock: a doer's clock stops at first submission, reviewers get 24 hours before delay counts against them, and deadline changes are logged with a reason.
  • Docker, GitHub Actions CI on throwaway Postgres and Redis with a schema-drift check, DigitalOcean, Nginx.
Node.jsExpressPostgreSQLPrismaRedisBullMQSocket.ioNext.jsDockerGitHub Actions

tasktap.ai

tasktap.ai · owner dashboard
TaskTap owner dashboard: team status, pending approvals and today's performance

Demo organisation.

AI operations tooling · MCP · 2026

Production, read-only

When something breaks at 11 PM the answer is spread across logs, the database, the queues, the containers and Nginx. I built an MCP server so Claude can look at all of it for me, and a workflow that lets it investigate incidents without ever being able to change production.

  • 54 read-only tools: logs and error clusters, BullMQ queue state, Postgres queries and EXPLAIN, Docker stats, Nginx 5xx and slow-request summaries, deploy history.
  • Read-only is enforced in layers, not in a prompt: a SELECT-only database role with secret columns hidden, a SQL validator, read-only transactions, and every call logged with a per-session data budget.
  • Incident flow: a worker gathers evidence, the model writes a report where every claim cites it, a human approves the plan, the fix is built in an isolated worktree with tests in a no-network container, and a second approval gates the merge. Nothing merges or deploys on its own.
  • Alerts go out by email, not through the worker, so the alert path never depends on the thing it alerts about.
Model Context ProtocolClaude CodeNode.jsPostgreSQLRedisDockerNginx
toolreadswrite
backend_error_clusterslogsdenied
redis_bullmq_failedqueuesdenied
pg_explaindatabasedenied
nginx_5xx_summarywebdenied
docker_statscontainersdenied
git_deploy_historydeploysdenied
…48 moredenied

Enforced by: SELECT-only role · SQL validator · read-only transactions · call log with budget

How an incident moves through it

Production evidencelogs · queues · database · Nginx · deploy history
Read-only MCP server54 tools · no write path · every call logged
Claude Code writes a reportevery claim cites the evidence · proposes a plan · runs nothing
Human approves the plannothing moves until a person says so
Fix in an isolated worktreebounded tests in a container with no network · pass or fail comes from the run, not the model
Human approves the mergeno autonomous push, merge or deploy

Guardrails live in code and state machines, not in prompts. Alerts go out by email so the alert path never depends on this worker.

Side project · Android · Apr 2026 → now

Spendly

An expense tracker that reads your bank and UPI transaction SMS, so there is no bank login and no account linking. Every Indian bank writes SMS differently, so most of the work is in the parser.

Case study · the parser

The first on-device SMS parser missed many bank and UPI message formats, so testers saw incomplete expense data. I collected real SMS samples and feedback from the testers directly and reworked the transaction engine: merchant learning, duplicate detection, confidence scoring and normalisation across formats. It now reads 30+ Indian banks and UPI providers, and every release on Google Play internal testing is shaped by what the 20+ testers report.

  • Transaction engine for 30+ Indian banks and UPI providers: merchant learning, duplicate detection with a hash key shared by app and server, automatic categorisation, and a confidence score. Anything under 70 is kept as "unverified" instead of silently dropped.
  • React Native and TypeScript on the phone; Node.js, PostgreSQL and Prisma behind it, Dockerised, Firebase Authentication, offline-first sync that re-reads 60 days when the parser improves.
  • Google Play internal testing with 20+ testers. A 39-message parity test keeps the app and server parsers in agreement.
React NativeTypeScriptNode.jsPostgreSQLPrismaDockerFirebase Auth
Spendly category split
Spendly home with parsed transactions
Spendly spending analysis

Notes from production

Bugs I have actually chased. Short versions.

AuthEvery test passed. Users still got logged out.Two actors rotating the same refresh token, plus a redirect loop between two hosts with separate cookie jars. Each half was correct alone, so the fix was a composition test that runs the whole flow.Read the full note

"Random logouts" took four pull requests over three weeks, and every one of them shipped with a green test suite. The first cause was two actors rotating the same refresh token: the web app and a background request each thought it was the only one refreshing, so one of them always ended up holding a token the server had just retired. The second cause only showed up in production, where the app lives on two hosts with separate cookie jars: a redirect between them bounced the browser back and forth until the session looked invalid.

Each half was correct on its own, which is exactly why the unit tests passed. The fix that finally held was a composition test that runs the whole login, refresh and redirect flow across both hosts the way a real browser does. The lesson I took from it: test the seam, not the pieces, because the bug lives where two correct things meet.

TimezonesSubmitted before it was assignedTwo-thirds of submitted tasks showed a submit time earlier than their assignment. Organisations defaulted to UTC and the board sliced the time off an ISO string. Fixed with one date-logic file ("a due date is a calendar date, not an instant") and a data fix shipped inside the migration.Read the full note

A customer noticed that tasks on their board were "submitted" hours before anyone had been assigned to them. When I looked, about two-thirds of all submitted tasks had the same impossible order. Two defaults had combined: new organisations were created in UTC rather than their own timezone, and the board took an ISO timestamp and simply sliced the time off it to get a date. In India, that moves a late-evening submission to the previous day.

The fix was one small date module with one rule, "a due date is a calendar date, not an instant", and a conversion that always goes through the organisation's own timezone. Every screen and every reminder reads dates through that module now, so there is one place to be wrong instead of thirty. The historical rows were corrected by a data fix shipped inside the same migration, so the code and the data changed together and nobody had to run a script by hand.

QueuesThe recurring job that quietly ran twice a dayA timezone change left the old BullMQ repeat running next to the new one. Now the scheduler is keyed by template id and reconciles queue state against the database at boot.Read the full note

Recurring work in TaskTap ("payroll on the 1st", "standup every weekday at 9:30") is created by BullMQ repeat jobs. When an organisation changed its timezone, the schedule was re-registered with the new time, but the old repeat kept running too, because a repeat job's key cannot be addressed once it is created. For weeks that organisation got each recurring task twice a day, a few hours apart.

Two changes fixed it for good. The scheduler is now keyed by the recurring template's id, so there can only ever be one live schedule per template. And at boot, the worker reconciles what the queue thinks is scheduled against what the database says should exist, removing anything the database no longer knows about. The same review caught a cousin bug: a reminder re-enqueued after a restart could be delivered, and charged for, twice. Reminders are now only rescheduled when the task is more than a day away, so a restart can never double-send.

PaymentsRazorpay UPI Autopay cannot be updatedSeat changes need a replacement subscription for UPI and an in-place update for cards. Prorated top-ups are idempotent on the payment id, so a retry never charges twice.Read the full note

TaskTap bills per seat, and a team's seat count changes all the time. With a card subscription, Razorpay lets you update the amount in place. With a UPI Autopay mandate, it does not: the mandate is fixed at the amount the customer approved, so the only way to change seats is to create a replacement subscription and retire the old one at the right moment. The billing code had assumed every subscription could be edited the same way, which worked for every test customer and failed for the first real one on UPI.

The billing flow now branches on the payment method, and the awkward UPI case is handled with a replacement subscription that starts exactly when the old one ends. Prorated top-ups for seats added mid-cycle are keyed on the payment id, so a retried webhook or a double tap can never charge twice. Payments that fail halfway are the unglamorous part of a SaaS, and the part I most want to get right.

IntegrationsWhatsApp templates are contractsEvery reminder failed because the code sent en_US and the templates were registered as en. The kill switch now accepts "False", "off" and "no" with a trailing space, because that is what config files contain.Read the full note

WhatsApp reminders are the feature customers notice first, and one morning every single one failed. The templates had been registered with the language code "en", and the code was sending "en_US". WhatsApp treats the template name plus language as a contract, so a mismatch is simply a message that does not exist. Nothing crashed; the queue just drained into errors.

The fix was a one-line change and a lot of hardening around it. The template language now comes from one place and is checked when the worker starts. The kill switch that turns WhatsApp sending off accepts "False", "off" and "no" with a trailing space, because those are the values that actually appear in config files written by hand at 11 PM. And alerts about the WhatsApp worker go out by email, not over WhatsApp, so the alert path never depends on the thing it is alerting about.

CINothing ran the tests before deployCI now runs on throwaway Postgres and Redis with a schema-drift check, and a bad deploy is blocked by a failing test rather than noticed by a customer.Read the full note

For a while TaskTap had tests and a deploy pipeline, and nothing connecting the two. A deploy would go out on a push, and whether the tests had been run depended on whether I remembered to run them. As the only engineer I always meant to. The honest fix was to make the machine remember.

CI now brings up a throwaway Postgres and Redis for every run, applies the migrations from scratch, and runs the backend suite against them. A schema-drift check compares the Prisma schema with the migrations, so a model change without a migration fails the build instead of failing in production. The deploy job depends on the checks job, which taught me a GitHub Actions lesson the hard way: a job name with a hyphen inside an expression parses as subtraction, so the dependency silently never applied until the name changed. Now a bad deploy is blocked by a red test, not noticed by a customer.

Experience

Jul 2026 → now

Founding Engineer · Digital Inclined

Report directly to the founder at a company of about 12 people. Own TaskTap.ai's architecture, backend, infrastructure and mobile apps; hired and mentor the team's first intern. Hybrid, Delhi NCR.

Jan – Jun 2026

Software Engineer Intern · Digital Inclined

Event-driven systems on BullMQ, Redis and Socket.io for reminders, workflow automation and real-time collaboration. JWT with refresh rotation, RBAC and TOTP two-factor for multi-tenant organisations.

Jun – Aug 2025

Backend Developer & DevOps Intern · Digital Inclined

Backend for a Meta Ads CRM syncing 100+ client ad accounts through the Graph API. PDF reports automated with PDFKit and Puppeteer, cutting manual effort by over 90%. GCP Compute Engine, Cloud SQL and Nginx with HTTPS.

Education

Thapar Institute of Engineering and Technology

B.E. Electronics and Instrumentation · 2022 – 2026

How I work with AI

Claude Code every day, on a leash: read-only access to production, approval gates written in code, and a test run that decides pass or fail instead of the model saying so. Guardrails belong in code, not in prompts.

Stack

Languages

JavaScriptTypeScriptSQL

Backend

Node.jsExpressRESTPrismaBullMQSocket.ioJWTRBAC

Data

PostgreSQLRedisMongoDB

Web & mobile

React NativeReactNext.jsTailwind CSS

Infrastructure

DockerGitHub ActionsDigitalOceanGCPLinuxNginx

AI & integrations

MCPClaude CodeOpenRouterOAuth 2.1RazorpayWhatsApp Business APIAppSumoFirebase