The shape of what I build: a web app talking to software on local machines, safely.
99.9%WebSocket message delivery
500+booking workflows / month on the CRM
642→1leaked rclone servers per worker, after the fix
70%fewer failed task executions
75%faster quotations
80%less environment setup time
00 / whoami
The short version
I'm Shivansh Ahirwal, a backend engineer based in Gurugram, Haryana, originally from Indore, Madhya Pradesh.
At EventGraphia I work where the web meets the physical world: photographers'
memory cards, local hard drives and terabytes of event photos that have to reach the cloud
intact, even when laptops sleep and Wi-Fi drops.
That's meant building a desktop agent framework, a WebSocket layer that
reconnects and resumes, persistent queues that survive crashes, and the
Django CRM that runs the business on top. I'm happiest tracing a bug down
through every layer until the numbers line up.
Outside the day job I build AI agents that run on local models, ship side projects
entirely on free tiers, and also design and pitch storefronts. I'm comfortable owning
the whole path from a database migration to a client presentation.
role
SDE-1 · Backend Engineer
company
EventGraphia · since Jan 2025
location
Gurugram, Haryana
hometown
Indore, Madhya Pradesh
core
Python · Django · DRF
edges
WebSockets · queues · agents
cloud
AWS EC2 · S3 · CloudFront
education
B.Tech CSE · SAIT · 2026
open_to
backend & platform roles
work_from
Gurugram (NCR) · Indore · remote
01 / incident reports
Problems I've chased down
Written the way I'd write a postmortem: what broke, why, what fixed it, and what stops it coming back.
SEV-1performance · memory
642 rclone servers and a 12 GB swap file
Symptom
Image renders on the upload agent stalled for minutes (render waited 234s for free memory), even after worker counts and memory gates had been tuned.
Root cause
Agent logic modules are re-executed before every queued task, so a module-level handle for the rclone server reset each time. Every uploaded file started a new server and never stopped the old one: 642 processes and about 12 GB of memory.
Fix
Moved cross-task state into a process-level holder and tagged long-lived child processes so they can be found and stopped by what they are, not only through an in-memory handle.
Guardrail
A written rule beside the module registry, plus a habit: after any RAM fix, audit the whole process tree during a real run and re-check minutes later. Measure, don't assume.
Python
process lifecycle
profiling
desktop agent
SEV-2reliability · ux
Uploads that survive a refresh, a disconnect or a crash
Problem
Multi-hour photo uploads ran on a local agent. Refreshing the page or restarting the agent lost track of the run.
Approach
Contributed to a pipeline where the agent stays tokenless: it does local work, then pauses at each API step and saves its state durably, while the browser makes every backend call. Runs resume after a restart, skip finished files and reuse their upload keys, so nothing is duplicated.
Also
Replaced 1-second polling with pushed progress over WebSocket, removing a stream of database writes every session.
state machine
WebSockets
SQLite
React
SEV-2migration · data safety
WebP across five repos without touching old data
Goal
Cut storage and bandwidth by serving WebP previews, while face recognition still needed JPEG.
Approach
Worked on a change where one key-derivation function is gated: for legacy deliverables it's an exact no-op. Face indexing reads the HD JPEG but keeps the original ID, because otherwise search silently returns zero matches.
Caught in review
Dropped ICC colour profiles and small images being silently upscaled. Both were fixed with tests.
AWS S3
Rekognition
Pillow
backward-compat
SEV-3infra · rollout
Signed URLs to signed cookies, in four safe steps
Goal
Let browsers cache gallery media on repeat views and cut per-image signing work on the API.
Approach
Moved CloudFront media to per-booking signed cookies. Shipped as four small commits, each a no-op on its own and all behind a feature flag that's off by default, enabled on exactly three views.
Why it matters
Shared gallery builders also serve public pages, so the flag keeps those paths untouched.
CloudFront
Django
feature flags
02 / how I work
House rules
The habits behind the numbers. I wrote most of these down after something taught me why.
HOUSE_RULES.mdmain
Measure, don't assume. A fix isn't done until I've watched it work under a real run.
Old data is a no-op. Migrations are gated so legacy records come through byte-for-byte unchanged.
Spec before code. A short, checkable spec stops tickets from being reopened.
Small diffs, behind flags. Each step can be reviewed and reverted on its own.
Parse, don't pattern-match. Paths, URLs, versions and dates get compared as structures, because "/media/EG 40" is not a prefix of "/media/EG 403".
Never trust a near-miss input. I test the input that's almost right, because that's the one that fails silently.
Back up before you rebase. Only delete data you created. Never force-push without asking.
AI is a teammate, with guardrails. I run agentic workflows with review skills, migration-safety checks and constrained tools.
An autonomous code-review agent for Python/Django. It runs a planner → tool → validate loop with JSON-checked steps, local inference through Ollama, and file and shell tools constrained so the agent can't wander. Packaged in Docker.
Python
LLMs
Ollama
Docker
ai pipeline · b2b · in progress
AI Reels + Wholesale Platform
Two products for a clothing manufacturer. An LLM writes product reel scripts, then FFmpeg, MoviePy and edge-tts render the videos, with human approval before publishing. Alongside it, a B2B catalogue with MOQ pricing and quotes. Built entirely on free tiers.
Django
Celery
Groq
Ollama
React
Postgres
design + engineering · client pitch
Luxury Storefront Redesign
A pitch for a luxury fashion e-commerce brand: a pitch deck plus three fully built homepage directions using the brand's real catalogue, with a headless Shopify (Hydrogen) plan that keeps checkout and inventory as they are.
HTML/CSS/JS
Shopify Hydrogen
SEO
UI design
05 / stack
Tools I reach for
languages
Python
SQL
JavaScript
backend
Django
Django REST Framework
FastAPI
Celery
data
PostgreSQL
MySQL
MongoDB
SQLite
Redis
messaging & real-time
WebSockets
RabbitMQ
Huey queues
Async processing
cloud & ops
AWS EC2
S3
CloudFront
Rekognition
Docker
Nginx
Gunicorn
Linux
CI/CD
ai & automation
AI agents
LLM integration
Ollama
Groq
n8n
Selenium
quality
Pytest
API & integration tests
flake8
Code review
frontend & web
React
HTML/CSS
Technical SEO
Shopify
06 / contact
Have a system that needs to stay up?
I'm open to backend and platform roles in Gurugram / Delhi NCR or Indore (and remote), plus freelance Django, API or automation work.