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.9
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.

5 client systems in production or pilot, plus reusable Frappe apps used across client projects, since 2023. The two client flagships and two products of my own come first. Client names are withheld; the engineering is shown in full.

Vending ERP
In production · client work · sole developer

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 (unit counters, and volume × yield) feed one consumption-formula 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, video-call 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 on approval can't create a second invoice or membership.
  • Python
  • Frappe
  • MariaDB
  • Flutter
  • Vue
  • Video API
  • 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 work

Every system I've shipped, in brief.

Open a row for one operations, one dashboard or report, and one engineering highlight.

Institute ERPFrom first enquiry to teacher payout, for a test-prep institute.

In production · client work

  • OperationsFees split into 1–3 instalments with the total enforced on the server, and one click on collection posts the order, receipt and invoice with tax, advance allocated.
  • DashboardsFollow-up boards with Overdue, Today and Upcoming cards for admissions and payment chasing, plus fee-receivable and teacher-payable reports (carry-forward + payable − paid = balance).
  • EngineeringA single send of result links overloaded the server because each click rendered a PDF. I moved rendering into one background job per student, uploading to S3, so each link only redirects.
  • Python
  • Frappe
  • ERPNext
  • MariaDB
  • Redis
Read more →
Practice ERPA tax and accounting practice, run end to end on ERPNext.

In production · client work

  • OperationsProjects and tasks are generated per filing period from templates, and work logs build timesheets automatically, so billable work is captured without re-entry.
  • ReportsA bill-gap report expands each recurring service into its billing cycles (monthly, quarterly, half-yearly, yearly) and shows which periods are billed, missing or over-billed, with the amount pending.
  • EngineeringEvery bill line is tied to the exact service period it covers, and the server blocks billing a period twice (within or across bills) or leaving a gap.

Co-built with one other developer. We each built and fixed parts of the other's work.

  • Python
  • Frappe
  • ERPNext
  • MariaDB
Read more →
HVAC Service OperationsFrom installed unit to service visit to spares, for an HVAC sales-and-service company.

Pilot · in refinement

  • OperationsAnnual maintenance contracts are sold per unit and generate their own visit schedule; spares are billed or free by contract type and issued from each technician's own van warehouse.
  • DashboardsA technician board of open visits with equipment, address and warranty source, and a manager Customer 360 with contracts, warrantied units and history.
  • EngineeringAn overlap guard stops two contracts covering the same unit, visits are created only once per scheduled date, and each visit knows its type (installation, contract or warranty) automatically.
  • Python
  • Frappe
  • ERPNext
  • MariaDB
Read more →

Reusable apps

Built once, installed across client projects.

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, tax invoicing with state-wise splits, and stock depletion against consumption formulas with idempotent approve / cancel / re-approve transfers.

  • Billing
  • Idempotency

One router, any messaging 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. Currently a pilot.

  • 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 payment-gateway flows for link expiry, partial settlement and status drift. Also introduced automated tests to an untested codebase.

  • Payments
  • 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 messaging and email, with background jobs handling bulk dispatch.

  • AWS S3
  • Background jobs

03Toolkit$ cat toolkit.md

What I reach for.

Languages
PythonSQLJavaScript (Frappe Desk: client scripts, dashboards)
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
RazorpayMessaging APIs (WhatsApp, SMS, email)Push notifications (FCM)Video-meeting APIsBiometric devicesAWS S3 storage

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. 2023

    First Django apps

    Python Full Stack · JSpiders

    My first Django apps: a blog and a to-do list. Small, but they’re where models, auth and payments first clicked.

  5. 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.

  6. 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.

  7. 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

Hand-built first. Agentic now.
Disciplined throughout.

For two years I wrote production ERP code by hand, so I know where an AI agent cuts corners. Today I build with coding agents through a documented process, not vibe coding.

  1. 01

    Grill

    Pressure-test the idea with the agent: edge cases, data model, failure modes.

  2. 02

    Spec

    Agreed decisions become a written spec with acceptance criteria.

  3. 03

    Slice

    Epics broken into small, independently shippable tickets.

  4. 04

    Test → Build

    Criteria become tests (moving to strict test-first); the agent builds against them.

  5. 05

    Review

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

Process adapted from open community skill sets (e.g. Matt Pocock's refine-before-building skills), tuned per project.

06 — Contact

Building something that has to just work?

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

Say hello →