Skip to content

Open to backend roles — Django, Python, PostgreSQL.

Vatsal
Kanojiya

Bengaluru · IST

Python backend engineer. I turn messy business operations into shipped systems: billing, inventory, payments.

Production ERP, billing, HR and payment systems on Frappe/ERPNext, and my own products on Django, DRF, Celery and PostgreSQL. Most of my work is data models, APIs, background jobs and the rules that keep money and stock correct when two things happen at once.

years shipping production backends
2.8
years shipping production backends
API endpoints behind one backend and three front ends
~300
API endpoints behind one backend and three front ends
result PDFs pre-generated overnight to end a production overload
~50k
result PDFs pre-generated overnight to end a production overload
report time after removing N+1 queries
5s → 1s
report time after removing N+1 queries

01Projects$ cat projects.md

Systems in production,
and what I build after hours.

Two client systems running in production and two products of my own. Client names are withheld; the engineering is shown in full.

Vending ERP
In production · client work

Vending ERP

Billing and operations ERP for a pan-India B2B vending operator.

  • Contracts become immutable once active. A change creates a new version cloned from the last, so every invoice traces back to the exact rules it was billed under.
  • Invoices claim meter readings by link and release them on cancel, so cancelling and regenerating an invoice can never bill a reading twice.
  • Two kinds of meter (cup counters, and litres × yield) feed one recipe model per item group, reconciled against actual stock movement to bill or waive each deviation.
  • Python
  • Frappe
  • ERPNext
  • MariaDB
  • Redis
Read the case study →
Networking Platform
In production · client work

Networking Platform

Re-platformed an undocumented Laravel networking app onto Frappe, then added what it never had.

  • Reverse-engineered the legacy system with no source access, by driving the app and watching the database, then designed the replacement schema.
  • Attendance verified three ways (venue geofence, host confirmation, Zoom time-in-meeting ≥ 85%), with points created, moved and reversed by hooks as activities change.
  • Platform-tagged sessions with a per-platform cap and least-recently-used eviction. Record-creating actions are guarded by a dialog lock plus SELECT … FOR UPDATE, so a double click can't create two invoices.
  • Python
  • Frappe
  • MariaDB
  • Flutter
  • Vue
  • Zoom
  • Firebase
Read the case study →
Expense Tracker
AI-assisted · hand rebuild in progress

Expense Tracker

Track spending, split bills, settle up.

  • Database constraints make splits add up, and every query is scoped to its owner, so one account can never read or change another's records.
  • Settle-up locks the rows it touches with select_for_update, so two people settling at the same moment can't double-count a balance.
  • Celery jobs are queued with transaction.on_commit, so exports, the monthly digest and vision-LLM bill scanning never run against half-saved data.

Built with heavy AI assistance while I drove the design. Every decision and its rejected alternative is in docs/DECISIONS.md. I'm now rebuilding it by hand.

  • Django
  • DRF
  • PostgreSQL
  • Celery
  • Redis
  • Docker
  • GitHub Actions
Read the case study →Source on GitHub ↗
Super Notes
Runs locally · deploy pending

Super Notes

Notes that answer back.

  • Hybrid retrieval: pgvector similarity and Postgres full-text search, ranked together, and every answer cites the notes it came from.
  • Revision-based sync: an edit made against a stale revision gets a 409 instead of silently overwriting another device's changes.
  • One quota layer for every AI feature, with idempotency keys so a retried request is never counted twice.

Built with Claude Code agents to my specs. I wrote the plans and acceptance criteria, and reviewed every diff.

  • Django
  • DRF
  • PostgreSQL
  • pgvector
  • Celery
  • Redis
  • Vue 3
  • Flutter
Read the case study →Source on GitHub ↗
More client workHR and Attendance · Institute ERP · Notification Router

In production · client work

HR and Attendance →

Attendance that fills itself in overnight.

  • Overnight jobs turn raw biometric and mobile punches into attendance, closing missing punches and handling leave and half-days.
  • Device punches are logged first and are safe to retry, so a repeated biometric message never double-counts.
  • Corrections keep what they replaced, so cancelling one restores the day exactly. All of it sits in hooks and overrides, with no changes to the framework core.
  • Python
  • Frappe
  • ERPNext HRMS
  • MariaDB

In production · client work

Institute ERP →

From first enquiry to teacher payout.

  • A single send of 50–70k WhatsApp result links overloaded the server, because every click rendered a heavy PDF on request. A server upgrade didn't help, which ruled out capacity, and I traced it to the synchronous rendering.
  • Fixed overnight: one background job per student renders the PDF in memory, uploads it to S3 and stores a pre-signed link, so the result link only redirects and the server does a lookup instead of a render.
  • Fees, enquiries, scheduling and faculty pay sit on ERPNext's accounting: collecting a fee posts the order, receipt, invoice and GST in one step.
  • Python
  • Frappe
  • ERPNext
  • MariaDB
  • Redis

In production · used across client projects

Notification Router →

Switch WhatsApp or SMS vendors from settings, not code.

  • Project code calls one interface, and a thin Frappe app per vendor sits behind it and normalises that vendor's response, so switching WhatsApp or SMS vendors is a setting, not a code change.
  • Test mode is detected from the site URL: restored production backups on dev servers send every message to a test recipient, or only log it, so real clients are never messaged and SMS costs are avoided.
  • Bulk sends of hundreds to thousands of messages run as background jobs, and the router infers the message type from its arguments so callers never pick a vendor API.
  • Python
  • Frappe
  • WhatsApp Business API
  • SMS gateways
  • FCM
  • Email

02Work$ cat work.md

Production systems,
real stakes.

ERP, billing, HR and payments for real businesses. Client names are withheld; the engineering is shown in full.

Software Engineer

360 IT Hub Pvt. Ltd. · Bengaluru

Feb 2025 – Present

Own delivery across 5–6 concurrent client projects on Frappe/ERPNext v15, coordinating a 4-person team spanning backend, Vue web, Flutter mobile and documentation.

A pan-India ERP, module by module

Took a vending service provider's ERP to production in stages, starting with CRM and then inventory, purchasing, supply, accounting and asset management, with custom apps on top of the stock core.

  • ERPNext
  • Data modelling

Consumption-based billing

Multi-site contract models, minimum-order-quantity waterfalls, GST invoicing with state-wise tax splits, and stock depletion against recipe matrices with idempotent approve / cancel / re-approve transfers.

  • Billing
  • Idempotency
  • GST

One router, any WhatsApp vendor

Replaced hard-coded vendor calls with a database-configurable notification router. Two incompatible APIs sit behind one interface and 12 call sites moved onto it, so switching provider is now a settings change.

  • Integrations
  • Design

Service contracts for HVAC

Modelled installed equipment, AMC contracts, scheduled visits, spare-part use, warranty claims and CRM follow-ups, with technician dashboards showing visit rosters against live van stock.

  • Domain modelling

HR that fixes itself overnight

Nightly auto-attendance for shift and half-day rules, geofenced mobile check-in, a biometric webhook and self-service dashboards that replaced month-end HR correction cycles.

  • HRMS
  • Background jobs

Reverse-engineering a legacy platform

Specified the replacement for an undocumented system in a BRD/FRD with a domain model, API contracts and a defect register that separates confirmed faults from inferred risk.

  • Specs
  • Architecture

Payments that don't drift

Hardened Razorpay flows for link expiry, partial settlement and status drift. Also introduced automated tests to an untested codebase.

  • Razorpay
  • Testing

Beyond the code

Scrum Master and Jira admin. Conducted 50+ technical interviews.

  • Leadership
  • Hiring

Associate Software Engineer

360 IT Hub Pvt. Ltd. · Bengaluru

Dec 2023 – Jan 2025

Reports, 5× faster

Cut report generation from ~5 s to ~1 s by replacing N+1 query patterns with batched queries. Built executive and payroll reports reconciling check-ins, attendance, holidays, leave and mid-cycle salary revisions.

  • Performance
  • SQL

Timesheet-to-billing

Built for an accounting firm, it surfaced unbilled overtime against contracted scope.

  • Billing

Recurring-task engine

Auto-generation, reassignment tracking and multi-channel dispatch. Automated recurring regulatory filings and subscription billing.

  • Schedulers

OTP-secured results portal

Delivered individualised S3-hosted result PDFs over WhatsApp and email, with background jobs handling bulk dispatch.

  • AWS S3
  • Background jobs

03Toolkit$ cat toolkit.md

What I reach for.

Languages
PythonSQLJavaScript
Frameworks
DjangoDjango REST FrameworkFrappe / ERPNext v15
Backend
REST APIsCeleryRedis / RQ jobsSchedulersTransactions & row lockingQuery optimisation
Data
PostgreSQLpgvectorFull-text searchMySQL / MariaDBSchema designIndexing
Tooling
Django tests / unittestGitGitHub ActionsDocker ComposeGunicornNginxLinuxAWS EC2 / S3
Integrations
RazorpayWhatsApp Business APIFCMZoomBiometric devicesSMS / email gateways

04Journey$ cat journey.md

From machines
to systems.

Mechanical engineer by training, software engineer by choice. The short version of how I got here.

  1. 2013 – 2023

    An engineer's foundation

    B.E. Mechanical · M.Tech Thermal — RGPV, Bhopal

    Mechanical and thermal engineering taught me to think in systems: flows, constraints, failure modes and what happens under load. The materials changed. The way of thinking didn’t.

  2. 2017 – 2018

    Learning how businesses buy

    Godrej & Boyce (Interio) · Raipur

    As a Graduate Apprentice Engineer in B2B sales, I sat on the client’s side of the table. Today I run requirement workshops with the same instinct: understand the business before modelling it.

  3. 2022 – 2023

    The switch to software

    Machine Learning · Stanford Online

    Machine learning was the door. Writing code that solved real problems was what kept me there, and I moved into software full-time.

  4. Dec 2023

    First production systems

    Associate Software Engineer · 360 IT Hub, Bengaluru

    Payroll reports, timesheet-to-billing, recurring task engines and a public results portal: real users, real money and real deadlines from the first month.

  5. Feb 2025

    Owning delivery

    Software Engineer · 360 IT Hub, Bengaluru

    Leading 5–6 concurrent client projects and a 4-person team across backend, web, mobile and docs, while taking a pan-India ERP to production one module at a time.

  6. Now

    Going deeper on Django

    Super Notes · Expense Tracker

    Building with Django, DRF, Celery and PostgreSQL: concurrency, idempotency, hybrid search and RAG. These are the problems I want to keep solving.

05How I work$ cat how-i-work.md

AI agents write code.
I own what ships.

I use Claude Code daily under a spec-first process. Speed from the agent, rigour from the process.

  1. 01

    Spec

    Write acceptance criteria before a line of code. The spec is the contract — for me and for the agent.

  2. 02

    Build

    Claude Code agents implement against the spec. I steer architecture, data model and edge cases.

  3. 03

    Verify

    Verification scripts run inside rolled-back transactions, so real data is exercised and nothing is left behind.

  4. 04

    Review

    Every generated diff is read by me. That's how a quantity above the top slab billing at ₹0 got caught before release.

06 — Contact

Building something that has to just work?

Open to backend roles — Django, Python, PostgreSQL. I reply to every message.

Say hello →